}
if (empty($type)) {
- require_once dirname(__FILE__) . '/Magic.php';
$type = Horde_Mime_Magic::filenameToMime($file, false);
}
return true;
}
- require_once dirname(__FILE__) . '/Address.php';
-
/* RFC 3798 [2.1]: Explicit confirmation is needed if there is more
* than one distinct address in the Disposition-Notification-To
* header. */
$mailparams = array(), $mod = array(),
$err = array())
{
- require_once dirname(__FILE__) . '/Headers.php';
- require_once dirname(__FILE__) . '/Part.php';
require_once 'Horde/Identity.php';
require_once 'Horde/Text.php';
<?php
require_once 'Horde/String.php';
-require_once dirname(__FILE__) . '/../Mime.php';
/**
* The Horde_Mime_Part:: class provides a wrapper around MIME parts and
if (($app != 'horde') && empty(self::$_config['mime_drivers'][$app])) {
$res = Horde::loadConfiguration('mime_drivers.php', array('mime_drivers', 'mime_drivers_map'), $app);
if (!is_a($res, 'PEAR_Error')) {
- require_once 'Horde/Array.php';
self::$_config = Horde_Array::array_merge_recursive_overwrite(self::$_config, $res);
}
}
static final protected function _resolveDriver($driver = 'default',
$app = 'horde')
{
+ $driver = ucfirst($driver);
+
$file = ($app == 'horde')
? dirname(__FILE__) . '/Viewer/' . $driver . '.php'
: $GLOBALS['registry']->applications[$app]['fileroot'] . '/lib/Mime/Viewer/' . $driver . '.php';
- require_once dirname(__FILE__) . '/Viewer/Driver.php';
-
return require_once $file;
}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Audio class sends audio parts to the browser for
+ * handling by the browser, a plugin, or a helper application.
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Audio extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_mimepart->getContents(),
+ 'status' => array(),
+ 'type' => $this->_mimepart->getType()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Css class renders CSS source as HTML with an effort
+ * to remove potentially malicious code.
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Css extends Horde_Mime_Viewer_Source
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Attribute preg patterns.
+ *
+ * @var array
+ */
+ protected $_attrPatterns = array(
+ // Attributes
+ '!([-\w]+\s*):!s' => '<span class="attr"">\\1</span>:',
+ // Values
+ '!:(\s*)(.+?)(\s*;)!s' => ':\\1<span class="value">\\2</span><span class="eol">\\3</span>',
+ // URLs
+ '!(url\([\'"]?)(.*?)([\'"]?\))!s' => '<span class="url">\\1<span class="file">\\2</span>\\3</span>',
+ // Colors
+ '!(#[[:xdigit:]]{3,6})!s' => '<span class="color">\\1</span>',
+ // Parentheses
+ '!({|})!s' => '<span class="parentheses">\\1</span>',
+ // Unity
+ '!(em|px|%)\b!s' => '<em>\\1</em>'
+ );
+
+ /**
+ * Handles preg patterns.
+ *
+ * @var array
+ */
+ protected $_handlesPatterns = array(
+ // HTML Tags
+ '!\b(body|h\d|a|span|div|acronym|small|strong|em|pre|ul|ol|li|p)\b!s' => '<span class="htag">\\1</span>\\2',
+ // IDs
+ '!(#[-\w]+)!s' => '<span class="id">\\1</span>',
+ // Class
+ '!(\.[-\w]+)\b!s' => '<span class="class">\\1</span>',
+ // METAs
+ '!(:link|:visited|:hover|:active|:first-letter)!s' => '<span class="metac">\\1</span>'
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+
+ // Need Horde headers for CSS tags.
+ reset($ret);
+ $ret[key($ret)]['data'] = Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+ $ret[key($ret)]['data'] .
+ Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ $css = preg_replace_callback('!(}|\*/).*?({|/\*)!s', array($this, '_handles'), htmlspecialchars($this->_mimepart->getContents(), ENT_NOQUOTES));
+ $css = preg_replace_callback('!{[^}]*}!s', array($this, '_attributes'), $css);
+ $css = preg_replace_callback('!/\*.*?\*/!s', array($this, '_comments'), $css);
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_lineNumber(trim($css)),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * TODO
+ */
+ protected function _comments($matches)
+ {
+ return '<span class="comment">' .
+ preg_replace('!(http://[/\w-.]+)!s', '<a href="\\1">\\1</a>', $matches[0]) .
+ '</span>';
+ }
+
+ /**
+ * TODO
+ */
+ protected function _attributes($matches)
+ {
+ return preg_replace(array_keys($this->_attrPatterns), array_values($this->_attrPatterns), $matches[0]);
+ }
+
+ /**
+ * TODO
+ */
+ protected function _handles($matches)
+ {
+ return preg_replace(array_keys($this->_handlesPatterns), array_values($this->_handlesPatterns), $matches[0]);
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Deb class renders out lists of files in Debian
+ * packages by using the dpkg tool to query the package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Deb extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+ if (!empty($ret)) {
+ reset($ret);
+ $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+ }
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $tmp_deb = Horde::getTempFile('horde_deb');
+
+ file_put_contents($tmp_deb, $this->_mimepart->getContents());
+
+ $fh = popen($this->_conf['location'] . " -f $tmp_deb 2>&1", 'r');
+ while (($rc = fgets($fh, 8192))) {
+ $data .= $rc;
+ }
+ pclose($fh);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => '<pre>' . htmlspecialchars($data) . '</pre>',
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Default class simply prints out the encapsulated
+ * content. It exists as a fallback if no other intelligent rendering
+ * mechanism could be used.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Default extends Horde_Mime_Viewer_Driver {}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Enriched class renders out plain text from enriched
+ * content tags, ala RFC 1896.
+ *
+ * By RFC, we must do the minimal conformance measures of: A minimal
+ * text/enriched implementation is one that converts "<<" to "<",
+ * removes everything between a <param> command and the next balancing
+ * </param> removes all other formatting commands (all text enclosed
+ * in angle brackets), and outside of <nofill> environments converts
+ * any series of n CRLFs to n-1 CRLFs, and converts any lone CRLF
+ * pairs to SPACE.
+ *
+ * We don't qualify as we don't currently track the <nofill>
+ * environment, that is we do CRLF conversion even if <nofill> is
+ * specified in the text, but we're close at least.
+ *
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Eric Rostetter <eric.rostetter@physics.utexas.edu>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Enriched extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * This driver's capabilities.
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => '<html><body>' . $this->_toHTML() . '</body></html>',
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
+ )
+ );
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Convert the enriched text to HTML.
+ *
+ * @return string The HTML-ified version of the MIME part contents.
+ */
+ protected function _toHTML()
+ {
+ $text = trim($this->_mimepart->getContents());
+ if (!strlen($text)) {
+ return array();
+ }
+
+ // We add space at the beginning and end of the string as it will
+ // make some regular expression checks later much easier (so we
+ // don't have to worry about start/end of line characters)
+ $text = ' ' . $text . ' ';
+
+ // We need to preserve << tags, so map them to ascii 1 or ascii 255
+ // We make the assumption here that there would never be an ascii
+ // 1 in an email, which may not be valid, but seems reasonable...
+ // ascii 255 would work if for some reason you don't like ascii 1
+ // ascii 0 does NOT seem to work for this, though I'm not sure why
+ $text = str_replace('<<', chr(1), $text);
+
+ // Remove any unrecognized tags in the text (via RFC minimal specs)
+ // any tags we just don't want to implement can also be removed here
+ // Note that this will remove any html links, but this is intended
+ $implementedTags = '<param><bold><italic><underline><fixed><excerpt>' .
+ '<smaller><bigger><center><color><fontfamily>' .
+ '<flushleft><flushright><flushboth><paraindent>';
+ // $unImplementedTags = '<nofill><lang>';
+ $text = strip_tags($text, $implementedTags);
+
+ // restore the << tags as < tags now...
+ $text = str_replace(chr(1), '<<', $text);
+ // $text = str_replace(chr(255), '<', $text);
+
+ $replace = array(
+ // Get color parameters into a more useable format.
+ '/<color><param>([\da-fA-F]+),([\da-fA-F]+),([\da-fA-F]+)<\/param>/Uis' => '<color r=\1 g=\2 b=\3>',
+ '/<color><param>(red|blue|green|yellow|cyan|magenta|black|white)<\/param>/Uis' => '<color n=\1>',
+
+ // Get font family parameters into a more useable format.
+ '/<fontfamily><param>(\w+)<\/param>/Uis' => '<fontfamily f=\1>',
+
+ /* Just remove any remaining parameters -- we won't use them.
+ * Any tags with parameters that we want to implement will have
+ * come before this. Someday we hope to use these tags (e.g. for
+ * <color><param> tags). */
+ '/<param>.*<\/param>/Uis' => '',
+
+ /* Single line breaks become spaces, double line breaks are a
+ * real break. This needs to do <nofill> tracking to be compliant
+ * but we don't want to deal with state at this time, so we fake
+ * it some day we should rewrite this to handle <nofill>
+ * correctly. */
+ '/([^\n])\r\n([^\r])/' => '\1 \2',
+ '/(\r\n)\r\n/' => '\1'
+ );
+ $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+ // We try to protect against bad stuff here.
+ $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
+
+ // Now convert the known tags to html. Try to remove any tag
+ // parameters to stop people from trying to pull a fast one
+ $replace = array(
+ '/(?<!<)<bold.*>(.*)<\/bold>/Uis' => '<span style="font-weight: bold">\1</span>',
+ '/(?<!<)<italic.*>(.*)<\/italic>/Uis' => '<span style="font-style: italic">\1</span>',
+ '/(?<!<)<underline.*>(.*)<\/underline>/Uis' => '<span style="text-decoration: underline">\1</span>'
+ );
+ $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+ $text = preg_replace_callback('/(?<!<)<color r=([\da-fA-F]+) g=([\da-fA-F]+) b=([\da-fA-F]+)>(.*)<\/color>/Uis', array($this, 'colorize'), $text);
+
+ $replace = array(
+ '/(?<!<)<color n=(red|blue|green|yellow|cyan|magenta|black|white)>(.*)<\/color>/Uis' => '<span style="color: \1">\2</span>',
+ '/(?<!<)<fontfamily>(.*)<\/fontfamily>/Uis' => '\1',
+ '/(?<!<)<fontfamily f=(\w+)>(.*)<\/fontfamily>/Uis' => '<span style="font-family: \1">\2</span>',
+ '/(?<!<)<smaller.*>/Uis' => '<span style="font-size: smaller">',
+ '/(?<!<)<\/smaller>/Uis' => '</span>',
+ '/(?<!<)<bigger.*>/Uis' => '<span style="font-size: larger">',
+ '/(?<!<)<\/bigger>/Uis' => '</span>',
+ '/(?<!<)<fixed.*>(.*)<\/fixed>/Uis' => '<font face="fixed">\1</font>',
+ '/(?<!<)<center.*>(.*)<\/center>/Uis' => '<div align="center">\1</div>',
+ '/(?<!<)<flushleft.*>(.*)<\/flushleft>/Uis' => '<div align="left">\1</div>',
+ '/(?<!<)<flushright.*>(.*)<\/flushright>/Uis' => '<div align="right">\1</div>',
+ '/(?<!<)<flushboth.*>(.*)<\/flushboth>/Uis' => '<div align="justify">\1</div>',
+ '/(?<!<)<paraindent.*>(.*)<\/paraindent>/Uis' => '<blockquote>\1</blockquote>',
+ '/(?<!<)<excerpt.*>(.*)<\/excerpt>/Uis' => '<blockquote>\1</blockquote>'
+ );
+ $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+ // Replace << with < now (from translated HTML form).
+ $text = str_replace('<<', '<', $text);
+
+ // Now we remove the leading/trailing space we added at the
+ // start.
+ $text = preg_replace('/^ (.*) $/s', '\1', $text);
+
+ // Make URLs clickable.
+ require_once 'Horde/Text/Filter.php';
+ $text = Text_Filter::filter($text, 'linkurls', array('callback' => 'Horde::externalUrl'));
+
+ /* Wordwrap -- note this could impact on our above RFC compliance *IF*
+ * we honored nofill tags (which we don't yet). */
+ $text = str_replace(array("\t", ' ', "\n "), array(' ', ' ', "\n "), $text);
+
+ if ($text[0] == ' ') {
+ $text = ' ' . substr($text, 1);
+ }
+
+ return '<p class="fixed">' . nl2br($text) . '</p>';
+ }
+
+ /**
+ * TODO
+ */
+ public function colorize($colors)
+ {
+ for ($i = 1; $i < 4; $i++) {
+ $colors[$i] = sprintf('%02X', round(hexdec($colors[$i]) / 255));
+ }
+ return '<span style="color: #' . $colors[1] . $colors[2] . $colors[3] . '">' . $colors[4] . '</span>';
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Enscript class renders out various content in HTML
+ * format by using GNU Enscript.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Enscript extends Horde_Mime_Viewer_Source
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_toHTML(false),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_toHTML(true),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Converts the code to HTML.
+ *
+ * @param boolean $inline Is this an inline display?
+ *
+ * @return string The HTML-ified version of the MIME part contents.
+ */
+ protected function _toHTML($inline)
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ /* Create temporary files for input to Enscript. Note that we can't
+ * use a pipe, since enscript must have access to the whole file to
+ * determine its type for coloured syntax highlighting. */
+ $tmpin = Horde::getTempFile('enscriptin');
+
+ /* Write the contents of our buffer to the temporary input file. */
+ file_put_contents($tmpin, $this->_mimepart->getContents());
+
+ /* Execute the enscript command. */
+ $lang = escapeshellarg($this->_typeToLang($this->_mimepart->getType()));
+ $results = shell_exec($this->_conf['location'] . " -E$lang --language=html --color --output=- < $tmpin");
+
+ /* Strip out the extraneous HTML from enscript. */
+ if ($inline) {
+ $res_arr = preg_split('/\<\/?pre\>/i', $results);
+ if (count($res_arr) == 3) {
+ $results = trim($res_arr[1]);
+ }
+ }
+
+ return $this->_lineNumber($results);
+ }
+
+ /**
+ * Attempts to determine what language to use for the enscript program
+ * from a MIME type.
+ *
+ * @param string $type The MIME type.
+ *
+ * @return string The enscript 'language' parameter string.
+ */
+ protected function _typeToLang($type)
+ {
+ $ext = Horde_Mime_Magic::MIMEToExt($type);
+
+ switch ($ext) {
+ case 'cs':
+ return 'java';
+
+ case 'el':
+ return 'elisp';
+
+ case 'h':
+ return 'c';
+
+ case 'C':
+ case 'H':
+ case 'cc':
+ case 'hh':
+ case 'c++':
+ case 'cxx':
+ case 'cpp':
+ return 'cpp';
+
+ case 'htm':
+ case 'shtml':
+ case 'xml':
+ return 'html';
+
+ case 'js':
+ return 'javascript';
+
+ case 'pas':
+ return 'pascal';
+
+ case 'al':
+ case 'cgi':
+ case 'pl':
+ case 'pm':
+ return 'perl';
+
+ case 'ps':
+ return 'postscript';
+
+ case 'vb':
+ return 'vba';
+
+ case 'vhd':
+ return 'vhdl';
+
+ case 'patch':
+ case 'diff':
+ return 'diffu';
+
+ default:
+ return $ext;
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Html class renders out HTML text with an effort to
+ * remove potentially malicious code.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Jon Parise <jon@horde.org>
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_html extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $html = $this->_cleanHTML($this->_mimepart->getContents(), false);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $html['html'],
+ 'status' => array(),
+ 'type' => $this->_mimepart->getType(true)
+ )
+ );
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ $html = $this->_cleanHTML($this->_mimepart->getContents(), true);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => String::convertCharset($html['data'], $this->_mimepart->getCharset()),
+ 'status' => $html['status'],
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Filters active content, dereferences external links, detects phishing,
+ * etc.
+ *
+ * @todo Use IP checks from
+ * http://lxr.mozilla.org/mailnews/source/mail/base/content/phishingDetector.js.
+ *
+ * @param string $data The HTML data.
+ * @param boolean $inline Are we viewing inline?
+ *
+ * @return array Two elements: 'html' and 'status'.
+ */
+ protected function _cleanHTML($data, $inline)
+ {
+ global $browser;
+
+ $phish_warn = false;
+
+ /* Deal with <base> tags in the HTML, since they will screw up our own
+ * relative paths. */
+ if (preg_match('/<base href="?([^"> ]*)"? ?\/?>/i', $data, $matches)) {
+ $base = $matches[1];
+ if (substr($base, -1) != '/') {
+ $base .= '/';
+ }
+
+ /* Recursively call _cleanHTML() to prevent clever fiends from
+ * sneaking nasty things into the page via $base. */
+ $base = $this->_cleanHTML($base, $inline);
+
+ /* Attempt to fix paths that were relying on a <base> tag. */
+ if (!empty($base)) {
+ $pattern = array('|src=(["\'])([^:"\']+)\1|i',
+ '|src=([^: >"\']+)|i',
+ '|href= *(["\'])([^:"\']+)\1|i',
+ '|href=([^: >"\']+)|i');
+ $replace = array('src=\1' . $base . '\2\1',
+ 'src=' . $base . '\1',
+ 'href=\1' . $base . '\2\1',
+ 'href=' . $base . '\1');
+ $data = preg_replace($pattern, $replace, $data);
+ }
+ }
+
+ require_once 'Horde/Text/Filter.php';
+ $strip_style_attributes = (($browser->isBrowser('mozilla') &&
+ $browser->getMajor() == 4) ||
+ $browser->isBrowser('msie'));
+ $strip_styles = $inline || $strip_style_attributes;
+ $data = Text_Filter::filter($data, 'xss',
+ array('body_only' => $inline,
+ 'strip_styles' => $strip_styles,
+ 'strip_style_attributes' => $strip_style_attributes));
+
+ /* Check for phishing exploits. */
+ if ($this->getConfigParam('phishing_check')) {
+ if (preg_match('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:[^>]*>\s*(?:\\1:\/\/)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^<]*<\/a)?/i', $data, $m)) {
+ /* Check 1: Check for IP address links, but ignore if the link
+ * text has the same IP address. */
+ if (!isset($m[3]) || ($m[2] != $m[3])) {
+ if (isset($m[3])) {
+ $data = preg_replace('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/' . preg_quote($m[2], '/') . '(?:[^>]*>\s*(?:$1:\/\/)?' . preg_quote($m[3], '/') . '[^<]*<\/a)?/i', 'class="mimeStatusWarning" $0', $data);
+ }
+ $phish_warn = true;
+ }
+ } elseif (preg_match_all('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/([^\s"\'>]+)["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?(.*?)<\/a/is', $data, $m)) {
+ /* $m[1] = Link; $m[2] = Target
+ * Check 2: Check for links that point to a different host than
+ * the target url; if target looks like a domain name, check it
+ * against the link. */
+ for ($i = 0, $links = count($m[0]); $i < $links; ++$i) {
+ $link = strtolower(urldecode($m[1][$i]));
+ $target = strtolower(preg_replace('/^(http|https|ftp):\/\//', '', strip_tags($m[2][$i])));
+ if (preg_match('/^[-._\da-z]+\.[a-z]{2,}/i', $target) &&
+ (strpos($link, $target) !== 0) &&
+ (strpos($target, $link) !== 0)) {
+ /* Don't consider the link a phishing link if the
+ * domain is the same on both links (e.g.
+ * adtracking.example.com & www.example.com). */
+ preg_match('/\.?([^\.\/]+\.[^\.\/]+)[\/?]/', $link, $host1);
+ preg_match('/\.?([^\.\/]+\.[^\.\/ ]+)([\/ ].*)?$/', $target, $host2);
+ if (!(count($host1) && count($host2)) ||
+ (strcasecmp($host1[1], $host2[1]) !== 0)) {
+ $data = preg_replace('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/' . preg_quote($m[1][$i], '/') . '["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?' . preg_quote($m[2][$i], '/') . '<\/a/is', 'class="mimeStatusWarning" $0', $data);
+ $phish_warn = true;
+ }
+ }
+ }
+ }
+ }
+
+ /* Try to derefer all external references. */
+ $data = preg_replace_callback('/href\s*=\s*(["\'])?((?(1)[^\1]*?|[^\s>]+))(?(1)\1|)/i', array($this, '_dereferCallback'), $data);
+
+ /* Get phishing warning. */
+ $status = array();
+ if ($inline && $phish_warn) {
+ $warning = array(
+ sprintf(_("%s: This message may not be from whom it claims to be. Beware of following any links in it or of providing the sender with any personal information."), _("Warning")),
+ _("The links that caused this warning have this background color:") . ' <span class="mimeStatusWarning">' . _("EXAMPLE") . '.</span>'
+ );
+
+ if (!$inline) {
+ $temp = array();
+ foreach ($phish_warning as $val) {
+ $temp[] = String::convertCharset($val, NLS::getCharset(), $this->_mimepart->getCharset());
+ }
+ $warning = $temp;
+ }
+
+ $status[] = array(
+ 'class' => 'mimestatuswarning',
+ 'text' => $warning
+ );
+ }
+
+ return array('html' => $data, 'status' => $status);
+ }
+
+ /**
+ * TODO
+ *
+ * @param string $m TODO
+ *
+ * @return string TODO
+ */
+ protected function _dereferCallback($m)
+ {
+ return 'href="' . Horde::externalUrl($m[2]) . '"';
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Images class allows images to be displayed.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Images extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_mimepart->getContents(),
+ 'status' => array(),
+ 'type' => $this->_getType()
+ )
+ );
+ }
+
+ /**
+ * Return the content-type to use for the image.
+ *
+ * @return string The content-type of the image.
+ */
+ protected function _getType()
+ {
+ $type = $this->_mimepart->getType();
+
+ switch ($type) {
+ case 'image/pjpeg':
+ /* image/jpeg and image/pjpeg *appear* to be the same entity, but
+ * Mozilla (for one) don't seem to want to accept the latter. */
+ return 'image/jpeg';
+
+ case 'image/x-png':
+ /* image/x-png == image/png. */
+ return 'image/png';
+
+ default:
+ return $type;
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Msexcel class renders out Microsoft Excel
+ * documents in HTML format by using the Gnumeric package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Msexcel extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $tmp_xls = Horde::getTempFile('horde_msexcel');
+ $tmp_out = Horde::getTempFile('horde_msexcel');
+
+ file_put_contents($tmp_xls, $this->_mimepart->getContents());
+ $args = ' -E Gnumeric_Excel:excel_dsf -T Gnumeric_html:html40 ' . $tmp_xls . ' ' . $tmp_out;
+
+ exec($this->_conf['location'] . $args);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => file_get_contents($tmp_out),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Mspowerpoint class renders out Microsoft Powerpoint
+ * documents in HTML format by using the xlHtml package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Mspowerpoint extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $data = '';
+ $tmp_ppt = Horde::getTempFile('horde_mspowerpoint');
+
+ file_put_contents($tmp_ppt, $this->_mimepart->getContents());
+
+ $fh = popen($this->_conf['location'] . " $tmp_ppt 2>&1", 'r');
+ while (($rc = fgets($fh, 8192))) {
+ $data .= $rc;
+ }
+ pclose($fh);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $data,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Msword class renders out Microsoft Word documents
+ * in HTML format by using the AbiWord package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Msword extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $tmp_word = Horde::getTempFile('msword');
+ $tmp_output = Horde::getTempFile('msword');
+ $tmp_file = str_replace(Horde::getTempDir() . '/', '', $tmp_output);
+
+ file_put_contents($tmp_word, $this->_mimepart->getContents());
+ $args = ' --to=html --to-name=' . $tmp_output . ' ' . $tmp_word;
+
+ exec($this->_conf['location'] . $args);
+
+ if (file_exists($tmp_output)) {
+ $data = file_get_contents($tmp_output);
+ $type = 'text/html';
+ } else {
+ $data = _("Unable to translate this Word document");
+ $type = 'text/plain';
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $data,
+ 'status' => array(),
+ 'type' => $type . '; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Ooo class renders out OpenOffice.org documents in
+ * HTML format.
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Marko Djukic <marko@oblo.com>
+ * @author Jan Schneider <jan@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Ooo extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $has_xslt = Util::extensionExists('xslt');
+ $has_ssfile = function_exists('domxml_xslt_stylesheet_file');
+ if (($use_xslt = $has_xslt || $has_ssfile)) {
+ $tmpdir = Util::createTempDir(true);
+ }
+
+ $fnames = array('content.xml', 'styles.xml', 'meta.xml');
+ $tags = array(
+ 'text:p' => 'p',
+ 'table:table' => 'table border="0" cellspacing="1" cellpadding="0" ',
+ 'table:table-row' => 'tr bgcolor="#cccccc"',
+ 'table:table-cell' => 'td',
+ 'table:number-columns-spanned=' => 'colspan='
+ );
+
+ $zip = &Horde_Compress::singleton('zip');
+ $list = $zip->decompress($this->_mimepart->getContents(), array('action' => HORDE_COMPRESS_ZIP_LIST));
+
+ foreach ($list as $key => $file) {
+ if (in_array($file['name'], $fnames)) {
+ $content = $zip->decompress($this->_mimepart->getContents(), array(
+ 'action' => HORDE_COMPRESS_ZIP_DATA,
+ 'info' => $list,
+ 'key' => $key
+ ));
+
+ if ($use_xslt) {
+ file_put_contents($tmpdir . $file['name'], $content);
+ } elseif ($file['name'] == 'content.xml') {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => str_replace(array_keys($tags), array_values($tags), $content),
+ 'status' => array(),
+ 'type' => 'text/html; charset=UTF-8'
+ )
+ );
+ }
+ }
+ }
+
+ if (!Util::extensionExists('xslt')) {
+ return array();
+ }
+
+ $xsl_file = dirname(__FILE__) . '/Ooo/main_html.xsl';
+
+ if ($has_ssfile) {
+ /* Use DOMXML */
+ $xslt = domxml_xslt_stylesheet_file($xsl_file);
+ $dom = domxml_open_file($tmpdir . 'content.xml');
+ $result = @$xslt->process($dom, array(
+ 'metaFileURL' => $tmpdir . 'meta.xml',
+ 'stylesFileURL' => $tmpdir . 'styles.xml',
+ 'disableJava' => true)
+ );
+ $result = $xslt->result_dump_mem($result);
+ } else {
+ // Use XSLT
+ $xslt = xslt_create();
+ $result = @xslt_process($xslt, $tmpdir . 'content.xml', $xsl_file, null, null, array(
+ 'metaFileURL' => $tmpdir . 'meta.xml',
+ 'stylesFileURL' => $tmpdir . 'styles.xml',
+ 'disableJava' => true)
+ );
+ if (!$result) {
+ $result = xslt_error($xslt);
+ }
+ xslt_free($xslt);
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $result,
+ 'status' => array(),
+ 'type' => 'text/html; charset=UTF-8'
+ )
+ );
+ }
+}
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ extension-element-prefixes="xt"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+
+ <!-- ************ -->
+ <!-- *** body *** -->
+ <!-- ************ -->
+
+
+ <xsl:template match="/*/office:body">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- isDebugMode-START: only isDebugMode purpose: shows the inlined style attributes of the temporary variable -->
+ <xsl:if test="$isDebugMode and not($outputType = 'CSS_HEADER')">
+ <xsl:element name="debug_tree_of_styles"><xsl:text>
+ </xsl:text><xsl:for-each select="$collectedGlobalData/allstyles/*">
+<xsl:text> </xsl:text><xsl:value-of select="name()"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
+ </xsl:text>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:if>
+ <!-- isDebugMode-END -->
+
+
+ <!-- not using of 'apply-styles-and-content' as the content table information migth have been added to 'collectedGlobalData' variable -->
+ <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+
+ <!-- Usability feature, a link to the Content talbe above all level 1 header -->
+ <xsl:if test="$contentTableHeadings">
+ <xsl:call-template name="add-child-document-usability-links"/>
+ </xsl:if>
+
+
+ <xsl:choose>
+ <xsl:when test="not($outputType = 'WML') and not($outputType = 'PALM')">
+ <xsl:choose>
+ <!--If the input document is a global document and embed child documents (links) the transformation of the children will be started as well.
+ This is necessary as child documents do not know anything about their embedding into a global document. Chapters of childs
+ always start to count by zero instead of continously numbering.
+ For this, the chapter numbers of the current document (as a sequence of a global document) is dependent
+ of the number of chapter of the same level in preceding documents.
+ In case of multiple children, for usability reasons some linking is gonna be offered and the URLs of the content-table,
+ preceding and following file have to be given for the transformation.
+ -->
+ <xsl:when test="/*/@office:class='text-global' and /*/office:body/text:section/text:section-source/@xlink:href">
+ <!-- the children will be called later with a modified 'collectedGlobalData' variable -->
+ <xsl:call-template name="transform-global-document-and-children">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+
+ <!-- Usability feature, a link to the Content talbe above all level 1 header -->
+ <xsl:if test="$contentTableHeadings">
+ <xsl:call-template name="add-child-document-usability-links"/>
+ </xsl:if>
+
+
+ </xsl:template>
+
+
+
+
+ <!-- deactivating default template -->
+ <xsl:template match="*"/>
+
+
+ <!-- allowing all matched text nodes -->
+ <xsl:template match="text()">
+<!-- WML <xsl:value-of select="normalize-space(.)"/> -->
+ <xsl:value-of select="."/>
+ </xsl:template>
+
+
+
+ <!-- ################### -->
+ <!-- ### INLINE-TEXT ### -->
+ <!-- ################### -->
+
+
+ <!-- ****************** -->
+ <!-- *** Whitespace *** -->
+ <!-- ****************** -->
+
+
+ <xsl:template match="text:s">
+ <xsl:call-template name="write-breakable-whitespace">
+ <xsl:with-param name="whitespaces" select="@text:c"/>
+ </xsl:call-template>
+ </xsl:template>
+
+
+ <!--write the number of 'whitespaces' -->
+ <xsl:template name="write-breakable-whitespace">
+ <xsl:param name="whitespaces"/>
+
+ <!--write two space chars as the normal white space character will be stripped
+ and the other is able to break -->
+ <xsl:text> </xsl:text>
+ <xsl:if test="$whitespaces >= 2">
+ <xsl:call-template name="write-breakable-whitespace-2">
+ <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+
+ <!--write the number of 'whitespaces' -->
+ <xsl:template name="write-breakable-whitespace-2">
+ <xsl:param name="whitespaces"/>
+ <!--write two space chars as the normal white space character will be stripped
+ and the other is able to break -->
+ <xsl:text> </xsl:text>
+ <xsl:if test="$whitespaces >= 2">
+ <xsl:call-template name="write-breakable-whitespace">
+ <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+
+
+
+ <!-- *************** -->
+ <!-- *** Textbox *** -->
+ <!-- *************** -->
+
+ <xsl:template match="draw:text-box">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <!-- or -->
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
+ <xsl:element name="span">
+ <xsl:if test="@fo:min-height | @svg:width">
+ <xsl:attribute name="style">
+ <xsl:choose>
+ <xsl:when test="not(@svg:width)">
+ <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test="not(@fo:min-height)">
+ <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
+ <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="@draw:name"/>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!-- 2DO prove best usage for PALM -->
+ <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:element name="span">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!-- 2DO prove best usage for WML -->
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <!-- no nested p tags in wml1.1 allowed -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ID / NAME of text-box -->
+ <xsl:template match="@draw:name">
+
+ <xsl:attribute name="id">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:template>
+
+
+
+ <!-- ****************** -->
+ <!-- *** Paragraphs *** -->
+ <!-- ****************** -->
+
+ <xsl:template match="text:p | draw:page">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:choose>
+ <!-- in palm paragraphs children of text:list-items are better shown without 'p' tag-->
+ <xsl:when test="name(parent::*) = 'text:list-item'">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <!-- no nested p tags in wml1.1 allowed -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- ***************** -->
+ <!-- *** Text Span *** -->
+ <!-- ***************** -->
+
+ <xsl:template match="text:span">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="span">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="span">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <!-- no nested p tags in wml1.1 allowed -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- **************** -->
+ <!-- *** Headings *** -->
+ <!-- **************** -->
+
+ <xsl:template match="text:h">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Every heading element will get an unique anchor for its file, from its hiearchy level and name:
+ For example: The heading title 'My favorite heading' might get <a name="1+2+2+My+favorite+heading"/> -->
+ <xsl:choose>
+ <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
+ <!-- The URL linking of an table-of-content is due to a bug (cmp. bug id# 102311) not mapped as URL in the XML.
+ Linking of the table-of-content can therefore only be archieved by a work-around in HTML -->
+ <xsl:call-template name="create-heading">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- necessary as anchor for the content table -->
+ <xsl:call-template name="create-heading-anchor">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ <!-- no embedding the orginal header, as an explicit anchor might be already set -->
+ <xsl:call-template name="create-heading">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- default matching for header elements -->
+ <xsl:template name="create-heading">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+
+ <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
+ <xsl:element name="{$headertyp}">
+
+ <!-- outline style 'text:min-label-width' is interpreted as a CSS 'margin-left' attribute -->
+ <xsl:variable name="min-label" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/style:properties/@text:min-label-width"/>
+ <xsl:if test="$min-label">
+ <xsl:attribute name="style"><xsl:text>margin-left:</xsl:text><xsl:value-of select="$min-label"/><xsl:text>;</xsl:text></xsl:attribute>
+ </xsl:if>
+
+
+ <xsl:attribute name="class"><xsl:value-of select="translate(@text:style-name, '. %()/\', '')"/></xsl:attribute>
+
+ <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
+ <xsl:if test="string-length($office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@style:num-format) != 0">
+
+ <xsl:choose>
+ <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
+ <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level',
+ furthermore when the current document is referenced by a global document - as part of a whole sequence of documents -,
+ the chapter no. is dependent of the amount of started headers in preceding documents.
+ If the 'text:start-value is not set the default value of '1' has to be taken. -->
+ <xsl:variable name="startValue" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
+ <xsl:choose>
+ <xsl:when test="$startValue">
+ <xsl:choose>
+ <xsl:when test="@text:level='1'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel1
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='2'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel2
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='3'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel3
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='4'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel4
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='5'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel5
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='6'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel6
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='7'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel7
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='8'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel8
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='9'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel9
+ + $startValue"/>
+ </xsl:when>
+ <xsl:when test="@text:level='10'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel10
+ + $startValue"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@text:level='1'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel1
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='2'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel2
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='3'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel3
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='4'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel4
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='5'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel5
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='6'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel6
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='7'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel7
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='8'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel8
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='9'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel9
+ + 1"/>
+ </xsl:when>
+ <xsl:when test="@text:level='10'">
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $precedingChapterLevel10
+ + 1"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="get-absolute-chapter-no">
+ <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:when>
+
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
+ <xsl:element name="{$headertyp}">
+
+ <xsl:apply-templates select="@text:style-name">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
+ <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
+
+ <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+
+ </xsl:element>
+ </xsl:when>
+
+ <!-- 2DO: add Chapter No. for PALM and WML <-> problem nested apply-templates -->
+
+ <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
+ <xsl:element name="{$headertyp}">
+
+
+ <!-- All children content have to be nested in the styles (e.g. <i><b>ANY CONTENT</b></i>)
+ for this xsl:apply-templates will be called later / implicit -->
+ <xsl:call-template name="create-attribute-ALIGN">
+ <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
+ <xsl:with-param name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/@text:style-name]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <!-- no nested p tags in wml1.1 allowed -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <!-- since no header styles exist, an emphasis is used -->
+ <xsl:element name="em">
+
+ <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
+ <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
+
+ <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
+ <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+ + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="@text:style-name">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <!-- since no header styles exist, an emphasis is used -->
+ <xsl:element name="em">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- ************* -->
+ <!-- *** Link *** -->
+ <!-- ************* -->
+
+ <xsl:template match="text:a | draw:a">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:call-template name="create-common-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:template>
+
+
+ <xsl:template name="create-common-link">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <xsl:when test="not($outputType = 'WML')">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <!--<xsl:attribute name="class">ContentLink</xsl:attribute>-->
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- no nested p tags in wml1.1 allowed -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:apply-templates select="descendant::text()"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:apply-templates select="descendant::text()"/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- ******************* -->
+ <!-- *** Image Link *** -->
+ <!-- ******************* -->
+
+ <xsl:template match="draw:image">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- NO IMAGES SUPPLIED FOR WAP OR PALM -->
+ <xsl:if test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
+
+ <xsl:element name="img">
+ <xsl:if test="@svg:width">
+ <xsl:attribute name="width">
+ <xsl:call-template name="convert2pixel">
+ <xsl:with-param name="value" select="@svg:width"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@svg:height">
+ <xsl:attribute name="height">
+ <xsl:call-template name="convert2pixel">
+ <xsl:with-param name="value" select="@svg:height"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="svg:desc">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="svg:desc"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <!-- for images jared in open office document -->
+ <xsl:when test="contains(@xlink:href, '#Pictures/')">
+ <!-- creating an absolute http URL to the packed image file -->
+ <xsl:attribute name="src"><xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after(@xlink:href, '#Pictures/'), $optionalURLSuffix)"/></xsl:attribute>
+ </xsl:when>
+<!-- Due to a XT bug no DOS ':' before DRIVE letter is allowed, it would result in a unkown protoco exception, but a file URL for a DOS
+ path needs the DRIVE letter, therefore all relative URLs remain relativ
+
+ <xsl:when test="contains(@xlink:href,'//') or (substring(@xlink:href,2,1) = ':') or starts-with(@xlink:href, '/')">
+ <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <!~~ creating a absolute path/URL for the referenced resource ~~>
+ <xsl:attribute name="src"><xsl:value-of select="concat($absoluteSourceDirRef, @xlink:href, $optionalURLSuffix)"/></xsl:attribute>
+ </xsl:otherwise>
+-->
+ <xsl:otherwise>
+ <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ <!-- adding a line break to make the presentation more even with the OOo view -->
+ <xsl:element name="br"/>
+ </xsl:if>
+ </xsl:template>
+
+
+
+ <!-- ******************** -->
+ <!-- *** ordered list *** -->
+ <!-- ******************** -->
+
+ <xsl:template match="text:ordered-list">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="ol">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="ol">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:element name="ol">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- simulating content break of capsulated list elements -->
+ <xsl:when test="ancestor::text:list-item">
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <!-- simulating content break of capsulated list elements -->
+ <xsl:element name="br"></xsl:element>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <!-- simulating content break of capsulated list elements -->
+ <xsl:element name="br"></xsl:element>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- ********************** -->
+ <!-- *** unordered list *** -->
+ <!-- ********************** -->
+
+ <xsl:template match="text:unordered-list">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="ul">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="ul">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:element name="ul">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- simulating content break of capsulated list elements -->
+ <xsl:when test="ancestor::text:list-item">
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <!-- simulating content break of capsulated list elements -->
+ <xsl:element name="br"></xsl:element>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <!-- simulating content break of capsulated list elements -->
+ <xsl:element name="br"></xsl:element>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- ****************** -->
+ <!-- *** list item *** -->
+ <!-- ****************** -->
+
+ <xsl:template match="text:list-item">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="li">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="li">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:element name="li">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <!-- simulating list elements -->
+ <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
+ <xsl:text>* </xsl:text>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ <!-- list item break simulation (not in a table)-->
+ <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
+ <xsl:element name="br"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <!-- simulating list elements -->
+ <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
+ <xsl:text>* </xsl:text>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ <!-- list item break simulation (not in a table)-->
+ <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
+ <xsl:element name="br"/>
+ </xsl:if>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- ********************************************** -->
+ <!-- *** Text Section (contains: draw:text-box) *** -->
+ <!-- ********************************************** -->
+
+ <xsl:template match="text:section">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="not(contains(@text:display, 'none'))">
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="span">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="span">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:choose>
+ <xsl:when test="name(parent::*) = 'text:list-item'">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!--+++++ WML / WAP +++++-->
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="not($outputType = 'WML')">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- no nested p tags in wml1.1 allowed -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:line-break">
+ <xsl:element name="br"/>
+ </xsl:template>
+
+
+<!--
+ TABHANDLING PROBLEM: Tabs are possible to be shown in the HTML text file, but will be later stripped as whitespaces.
+ To prevent this one way would be the PRE tag which unfortunately ALWAYS result into a line-break. No surrounding NOBR tags help.
+
+ <xsl:template match="text:tab-stop">
+ <xsl:if test="not(preceding-sibling::text:tab-stop)">
+ <xsl:element name="pre"><xsl:text>	</xsl:text><xsl:for-each select="following-sibling::text:tab-stop"><xsl:text>	</xsl:text></xsl:for-each></xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text:tab-stop"><xsl:text>	</xsl:text></xsl:template>
+-->
+ <!-- HOTFIX: 8 non-breakable-spaces instead of a TAB is a hack sometimes less Tabs are needed and the code more difficult to read -->
+ <xsl:template match="text:tab-stop">
+ <xsl:call-template name="write-breakable-whitespace">
+ <xsl:with-param name="whitespaces" select="8"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- currently there have to be an explicit call of the style attribute nodes, maybe the attributes nodes have no priority only order relevant-->
+ <!-- STRANGE: checked with biorythm.sxc a simple xsl:apply-templates did not recognice the styles. Maybe caused by the template match order? -->
+ <xsl:template name="apply-styles-and-content">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+
+ <xsl:template match="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name-->
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:attribute name="class"><xsl:value-of select="translate(., '. %()/\', '')"/></xsl:attribute>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:attribute name="style"><xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/.]"/></xsl:attribute>
+ </xsl:when>
+
+ <!--+++++ PALM 3.2 SUBSET INLINED WAY and WML / WAP +++++-->
+ <xsl:when test="$outputType = 'PALM' or $outputType = 'WML'">
+ <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
+ <xsl:variable name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/.]"/>
+ <!-- changing the context node -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="create-nested-format-tags">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template match="text:sequence">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+
+</xsl:stylesheet>
--- /dev/null
+ <!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ extension-element-prefixes="xt"
+ xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
+ xmlns:sxghelper="http://www.jclark.com/xt/java/com.sun.star.xslt.helper.SxgChildTransformer"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+
+
+ <!-- ********************************************** -->
+ <!-- *** Global Document - Table of Content *** -->
+ <!-- ********************************************** -->
+
+
+
+ <xsl:template match="text:table-of-content">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:index-body">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates mode="content-table">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:index-title" mode="content-table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
+ <xsl:template match="text:reference-ref">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="@text:ref-name"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text:reference-mark">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="@text:name"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+
+
+ <xsl:template match="text:reference-mark-start">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="@text:name"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:variable name="endOfReference">
+ <xsl:for-each select="text:reference-mark-end[@name=current()/@text:name]">
+ <xsl:value-of select="position()"/>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:for-each select="following-sibling::*[position() < $endOfReference]">
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+
+
+
+ <!-- content table link -->
+ <xsl:template match="text:a" mode="content-table">
+ <xsl:param name="collectedGlobalData"/>
+
+
+ <!-- For anchors in content-headers a bug exists (cp. bug id# 102311) and they have to be worked out separately.
+ Currently the link used in the content-table of an Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+ is not a valid URL (cp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+ links in the Office XML, nor is the chapter no. known in the linked files.
+ A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
+ can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
+ All header titles gonna be encoding to be usable in a relative URL. -->
+ <xsl:choose>
+ <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled">
+ <xsl:call-template name="create-common-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="create-content-table-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="get-absolute-chapter-no">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="precedingChapterLevel1"/>
+
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-current-file-heading-no"/>
+ </xsl:variable>
+ <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
+
+ <xsl:call-template name="get-global-heading-no">
+ <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
+ <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+ </xsl:call-template>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
+ work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-current-file-heading-no"/>
+ </xsl:variable>
+ <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
+
+ <xsl:call-template name="get-global-heading-no">
+ <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
+ <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="get-current-file-heading-no">
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-current-child-heading-no')">
+ <xsl:value-of select="sxghelper:get-current-child-heading-no()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="get-next-current-file-heading-no">
+ <xsl:param name="file"/>
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-next-current-child-heading-no')">
+ <xsl:value-of select="sxghelper:get-next-current-child-heading-no($file)"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo($file)"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="get-global-heading-no">
+ <xsl:param name="currentFileHeadingNo"/>
+ <xsl:param name="precedingChapterLevel1"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-global-heading-no')">
+ <xsl:value-of select="sxghelper:get-global-heading-no(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+ <!-- necessary as anchor for the content table -->
+ <xsl:template name="create-heading-anchor">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!--
+ Currently the link used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+ is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+ links in the Office XML.
+ Here we are creating an anchor with the space normalized text of this header as potential jump address of the content table -->
+
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-next-current-file-heading-no">
+ <xsl:with-param name="file" select="$globalDocumentRefToCurrentFile"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
+ <xsl:if test="$isDebugMode">
+ <xsl:message>Matching child document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
+ <xsl:message>absolute-chapter-level: <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
+ <xsl:message>encodedTitle: <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
+ <xsl:message>globalDocumentRefToCurrentFile: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
+ <xsl:message>*** </xsl:message>
+ </xsl:if>
+
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$testResult/@absolute-chapter-level"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$testResult/@encoded-title"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
+ work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
+ <xsl:variable name="currentFileHeadingNo">
+ <xsl:call-template name="get-next-current-file-heading-no">
+ <xsl:with-param name="file" select="$contentTableURL"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>Matching global document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
+ <xsl:message>absolute-chapter-level: <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
+ <xsl:message>encodedTitle: <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
+ <xsl:message>contentTableURL: <xsl:value-of select="$contentTableURL"/></xsl:message>
+ <xsl:message>*** </xsl:message>
+ </xsl:if>
+
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$testResult/@absolute-chapter-level"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$testResult/@encoded-title"/>
+ </xsl:attribute>
+ </xsl:element>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+
+<!--
+
+ <xsl:variable name="title" select="normalize-space(.)"/>
+ <!~~DON'T WORK <xsl:variable name="title" select="normalize-space(descendant::text())"/> ~~>
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+ <xsl:variable name="testResults" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][$title = @title][current()/@text:level = @level]"/>
+ <xsl:if test="1 < count($testResults)">
+ <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
+ <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
+ <xsl:choose>
+ <xsl:when test="$encodedTitle">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$encodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!~~ even when it is not ~~>
+ <xsl:variable name="newEncodedTitle">
+ <xsl:call-template name="encode-string">
+ <!~~ the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT~~>
+ <xsl:with-param name="textToBeEncoded" select="$title"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$newEncodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="testResults" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][$title = @title][current()/@text:level = @level]"/>
+ <xsl:if test="1 < count($testResults)">
+ <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
+ <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
+ <xsl:message> *** </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
+ <xsl:choose>
+ <xsl:when test="$encodedTitle">
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$encodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!~~ even when it is not ~~>
+ <xsl:variable name="newEncodedTitle">
+ <xsl:call-template name="encode-string">
+ <!~~ the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT~~>
+ <xsl:with-param name="textToBeEncoded" select="$title"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="$newEncodedTitle"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+-->
+
+ </xsl:template>
+
+
+
+
+ <!-- ************************************** -->
+ <!-- CREATION OF A CONTENT TABLE LINK -->
+ <!-- ************************************** -->
+
+
+ <!-- a special behavior of text:a
+ (called from the 'text:a' template) -->
+
+ <xsl:template name="create-content-table-link">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <xsl:when test="not($outputType = 'WML')">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="starts-with(@xlink:href, '#')">
+ <xsl:variable name="correctHeading" select="$collectedGlobalData/content-table-headings/heading[current()/@xlink:href = @content-table-id]"/>
+
+ <xsl:value-of select="$correctHeading/@out-file-url"/>
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="$correctHeading/@absolute-chapter-level"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$correctHeading/@encoded-title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="create-common-link">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:call-template name="apply-styles-and-content">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- 2DO: currently no WML support
+
+ <!~~ no nested p tags in wml1.1 allowed ~~>
+ <xsl:choose>
+ <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:apply-templates select="."/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="p">
+ <xsl:element name="a">
+ <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+ <xsl:apply-templates select="."/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose> -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!--
+ CREATION OF A HELPER VARIABLE AS WORKAROUND FOR THE CONTENT TABLE ULR BUG
+
+
+ As no valid URL from the content table to the child documents exist in the content table,
+ a work-around is done:
+
+ First two helper variables are being created.
+
+ One containing the list of all references of the global document:
+ containg all their title,
+ for example:
+
+ <chapter-ref title="aTitle 1"/>
+ <chapter-ref title="aTitle 2"/>
+ <chapter-ref title="aTitle 2/>
+ <chapter-ref title="aTitle 3/>
+
+ The other containing all heading from the child documents linked from the global document.
+ The variable 'childrenHeadings' contains their title and the number of preceding similar titles,
+ for example:
+
+
+ <child file-url="aURL">
+ <heading title="aTitle1" level="1">
+ <heading title="aTitle2" level="2">
+ <heading title="aTitle3" level="1">
+ </child>
+
+ For each chapter reference from the content table the
+
+ by encoding the chapter names of the child document with the java URLEncoder and
+ use this as a part of a link. Furthermore for all heading elements a encoded anchor will be created from the heading.
+ Last the workaround parses all children documents for this anhor, as there is no distinction of files from the content table entries.
+
+ The new added node set to the collectedGlobalData variable concering the content table is written as
+
+
+ <content-table-headings content-table-url="aURL_ToTheGeneratedContentTable">
+ <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
+ <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
+ <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
+ <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
+ </content-table-headings>
+
+
+ Preconditions:
+ The correct sequence of child documents according to the Content Table is necessary, granted by the office.
+ -->
+ <xsl:template name="Create-helper-variables-for-Content-Table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the content table....</xsl:message></xsl:if>
+
+ <!-- Here a helper variable of the content table is created, of all chapter-references which point to a child document.
+ an 'chapter-ref' element will be created, containg their title and the number of preceding similar titles,
+ for example:
+
+ <chapter-ref title="aTitle 1"/>
+ <chapter-ref title="aTitle 2"/>
+ <chapter-ref title="aTitle 2"/>
+ <chapter-ref title="aTitle 3"/>
+ -->
+ <xsl:variable name="chapterRefs-RTF">
+ <!-- '/*/' as the flat and the zipped XML file format have different root elements -->
+ <xsl:for-each select="/*/office:body/text:table-of-content/text:index-body/text:p/text:a">
+ <xsl:variable name="currentTitle" select="normalize-space(string(.))"/>
+ <xsl:element name="chapter-ref">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$currentTitle"/>
+ </xsl:attribute>
+ <xsl:attribute name="content-table-id">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the content table!</xsl:message></xsl:if>
+
+
+
+
+ <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the child documents....</xsl:message></xsl:if>
+ <!-- Here a helper variable of created from the children documents.
+ Containg all heading elements from the child documents. Some or all of them are
+ chapters referenced by the Global Document.
+ The variable contains their title, the level of the heading and the file URL of the child,
+ for example:
+
+ <heading title="aTitle1" level="1" file-url="aURL1">
+ <heading title="aTitle2" level="2" file-url="aURL1">
+ <heading title="aTitle3" level="1" file-url="aURL1">
+ <heading title="aTitle4" level="1" file-url="aURL2">
+ <heading title="aTitle5" level="2" file-url="aURL2">
+ <heading title="aTitle2" level="3" file-url="aURL2">
+ <heading title="aTitle6" level="3" file-url="aURL2">
+ <heading-count>7</heading-count>
+ -->
+ <xsl:variable name="childrenHeadings-RTF">
+ <!-- all headers from children documents will be added -->
+ <xsl:apply-templates select="/*/office:body/text:section" mode="creation-of-variable"/>
+ </xsl:variable>
+ <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the child documents!</xsl:message></xsl:if>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="Create-global-variable-for-Content-Table">
+ <xsl:with-param name="chapterRefs" select="xt:node-set($chapterRefs-RTF)"/>
+ <xsl:with-param name="childrenHeadings" select="xt:node-set($childrenHeadings-RTF)"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="Create-global-variable-for-Content-Table">
+ <xsl:with-param name="chapterRefs" select="xalan:nodeset($chapterRefs-RTF)"/>
+ <xsl:with-param name="childrenHeadings" select="xalan:nodeset($childrenHeadings-RTF)"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+ <xsl:template name="Create-global-variable-for-Content-Table">
+ <xsl:param name="chapterRefs"/>
+ <xsl:param name="childrenHeadings"/>
+ <xsl:param name="collectedGlobalData"/>
+
+
+ <xsl:if test="$isDebugMode">
+ <!-- helper variable collecting all headings from the global document file children-->
+ <xsl:for-each select="$childrenHeadings/heading">
+ <xsl:message># <xsl:value-of select="position()"/></xsl:message>
+ <xsl:message>level: <xsl:value-of select="@level"/></xsl:message>
+ <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+ <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
+ <xsl:message>file-url: <xsl:value-of select="@file-url"/></xsl:message>
+ <xsl:message>header-no: <xsl:value-of select="@header-no"/></xsl:message>
+ <xsl:message>**</xsl:message>
+ </xsl:for-each>
+ <xsl:message>**</xsl:message>
+ <xsl:message>**</xsl:message>
+
+ <!-- helper variable collecting all heading references from the content table of the the global document -->
+ <xsl:message>childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
+ <xsl:for-each select="$chapterRefs/chapter-ref">
+ <xsl:message># <xsl:value-of select="position()"/></xsl:message>
+ <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+ <xsl:message>**</xsl:message>
+ </xsl:for-each>
+ </xsl:if>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:set-heading-no')">
+ <xsl:value-of select="sxghelper:set-heading-no(1)"/>
+ <xsl:value-of select="sxghelper:set-current-child-no(1)"/>
+ <xsl:value-of select="sxghelper:set-current-child-url(string($childrenHeadings/heading/@file-url))"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo(1)"/>
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo(1)"/>
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl(string($childrenHeadings/heading/@file-ur))"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$isDebugMode"><xsl:message>Creating global document variable for chapter relations....</xsl:message></xsl:if>
+ <xsl:variable name="contentTableHeadingsGlobalData-RTF">
+ <xsl:element name="content-table-headings">
+ <!-- all headings are linked from the current global document input file -->
+ <xsl:attribute name="content-table-url">
+ <xsl:value-of select="$contentTableURL"/>
+ </xsl:attribute>
+
+ <!-- had to use a for loop, as a recursion ends with an stackoverflow exception after about 600 recursive calls -->
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-heading-no')">
+ <xsl:for-each select="$chapterRefs/chapter-ref">
+ <xsl:call-template name="searchHeadingInChildDocument">
+ <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
+ <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
+ <xsl:with-param name="currentChapterRefNo" select="position()"/>
+ <xsl:with-param name="currentHeadingNo" select="sxghelper:get-heading-no()"/>
+ <xsl:with-param name="currentChildURL" select="sxghelper:get-current-child-url()"/>
+ <xsl:with-param name="currentChildNo" select="sxghelper:get-current-child-no()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo')">
+ <xsl:for-each select="$chapterRefs/chapter-ref">
+ <xsl:call-template name="searchHeadingInChildDocument">
+ <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
+ <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
+ <xsl:with-param name="currentChapterRefNo" select="position()"/>
+ <xsl:with-param name="currentHeadingNo" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo()"/>
+ <xsl:with-param name="currentChildURL" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildUrl()"/>
+ <xsl:with-param name="currentChildNo" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildNo()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:element>
+
+ <!-- adding the already exisiting global data environment -->
+ <xsl:copy-of select="$collectedGlobalData"/>
+ </xsl:variable>
+ <xsl:if test="$isDebugMode"><xsl:message>Finished global document variable for chapter relations!</xsl:message></xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="start-self-and-children-transformation">
+ <xsl:with-param name="collectedGlobalData" select="xt:node-set($contentTableHeadingsGlobalData-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="start-self-and-children-transformation">
+ <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($contentTableHeadingsGlobalData-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="searchHeadingInChildDocument">
+ <xsl:param name="chapterRefs"/>
+ <xsl:param name="childrenHeadings"/>
+ <xsl:param name="currentChapterRefNo"/>
+ <xsl:param name="currentHeadingNo"/>
+ <xsl:param name="currentChildURL"/>
+ <xsl:param name="currentChildNo"/>
+
+
+ <xsl:variable name="currentChapterRef" select="$chapterRefs/chapter-ref[$currentChapterRefNo]"/>
+ <xsl:variable name="currentChapterID" select="$currentChapterRef/@content-table-id"/>
+ <xsl:variable name="currentChapterTitle" select="$currentChapterRef/@title"/>
+
+ <xsl:variable name="currentChildHeading" select="$childrenHeadings/heading[$currentHeadingNo]"/>
+ <xsl:variable name="headingTitle" select="$currentChildHeading/@title"/>
+ <xsl:variable name="headingLevel" select="$currentChildHeading/@level"/>
+ <xsl:variable name="headingNo" select="$currentChildHeading/@header-no"/>
+ <xsl:variable name="newChildURL" select="$currentChildHeading/@file-url"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>*** new heading </xsl:message>
+ <xsl:message>currentChapterID: <xsl:value-of select="$currentChapterID"/></xsl:message>
+ <xsl:message>currentChapterTitle: <xsl:value-of select="$currentChapterTitle"/></xsl:message>
+ <xsl:message>currentChapterID: <xsl:value-of select="$currentChapterID"/></xsl:message>
+ <xsl:message>currentHeadingNo: <xsl:value-of select="$currentHeadingNo"/></xsl:message>
+ <xsl:message>headingTitle: <xsl:value-of select="$headingTitle"/></xsl:message>
+ <xsl:message>headingLevel: <xsl:value-of select="$headingLevel"/></xsl:message>
+ <xsl:message>headingNo: <xsl:value-of select="$headingNo"/></xsl:message>
+ <xsl:message>newChildURL: <xsl:value-of select="$newChildURL"/></xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="outFileURL">
+ <xsl:choose>
+ <xsl:when test="substring-before($newChildURL,'.xml')">
+ <xsl:value-of select="concat(substring-before($newChildURL,'.xml'),'.htm')"/>
+ </xsl:when>
+ <xsl:when test="substring-before($newChildURL,'.sx')">
+ <xsl:value-of select="concat(substring-before($newChildURL,'.sx'),'.htm')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="isChapterHeading" select="$headingTitle = $currentChapterTitle"/>
+ <xsl:variable name="isNewFile" select="string($newChildURL) != string($currentChildURL)"/>
+
+
+
+
+ <xsl:if test="$isNewFile">
+ <!-- reset of the already collected child headers -->
+ <xsl:call-template name="calc-chapter-numbers">
+ <xsl:with-param name="level" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:variable name="absoluteChapterLevel">
+ <xsl:call-template name="calc-chapter-numbers">
+ <xsl:with-param name="level" select="number($headingLevel)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+
+ <xsl:element name="heading">
+ <!-- necessary to as ID from the content table to get the correct heading element (the buggy URL used as ID)-->
+ <xsl:attribute name="content-table-id">
+ <xsl:choose>
+ <xsl:when test="$isChapterHeading">
+ <xsl:value-of select="$currentChapterID"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>only a heading, but not a chapter</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <!-- no of the used child, necessary for quick finding of chapters of next file -->
+ <xsl:attribute name="child-document-no">
+ <xsl:choose>
+ <xsl:when test="$isNewFile">
+ <xsl:value-of select="$currentChildNo + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$currentChildNo"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <!-- the URL of the child document source, containing the heading -->
+ <xsl:attribute name="file-url">
+ <xsl:value-of select="$newChildURL"/>
+ </xsl:attribute>
+ <xsl:attribute name="out-file-url">
+ <xsl:value-of select="$outFileURL"/>
+ </xsl:attribute>
+ <xsl:attribute name="level">
+ <xsl:value-of select="$headingLevel"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$headingTitle"/>
+ </xsl:attribute>
+ <xsl:attribute name="encoded-title">
+ <xsl:value-of select="$currentChildHeading/@encoded-title"/>
+ </xsl:attribute>
+ <xsl:attribute name="absolute-chapter-level">
+ <xsl:value-of select="$absoluteChapterLevel"/>
+ </xsl:attribute>
+ </xsl:element>
+
+
+ <xsl:choose>
+ <xsl:when test="$childrenHeadings/heading-count != $currentHeadingNo">
+ <!-- procede as long the list of children isn'nt worked through -->
+ <xsl:choose>
+ <xsl:when test="$isChapterHeading">
+ <!-- global variables have to be set, so the for-each loop can access them -->
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:set-heading-no')">
+ <xsl:value-of select="sxghelper:set-heading-no($currentHeadingNo + 1)"/>
+ <xsl:if test="$isNewFile">
+ <xsl:value-of select="sxghelper:set-current-child-no($currentChildNo + 1)"/>
+ <xsl:value-of select="sxghelper:set-current-child-url(string($newChildURL))"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo($currentHeadingNo + 1)"/>
+ <xsl:if test="$isNewFile">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo($currentChildNo + 1)"/>
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl($newChildURL)"/>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- not a chapter heading, call itself until a chapter ref is found or the end of headings is reached -->
+ <xsl:call-template name="searchHeadingInChildDocument">
+ <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
+ <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
+ <xsl:with-param name="currentChapterRefNo" select="$currentChapterRefNo"/>
+ <xsl:with-param name="currentHeadingNo" select="$currentHeadingNo + 1"/>
+ <xsl:with-param name="currentChildURL" select="$currentChildURL"/>
+ <xsl:with-param name="currentChildNo" select="$currentChildNo"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$isDebugMode">
+ <xsl:message>All child documents have been walked through without finding the chapter name!</xsl:message>
+ <xsl:message> childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
+ <xsl:message> currentHeadingNo: <xsl:value-of select="$currentHeadingNo"/></xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- Chapters from the Content Table have currently no anchor to child documents in OOo XML.
+ As solution, whenever a a global document every header of the HTML output gets get's an anchor in the Therefore-->
+ <xsl:template name="encode-string">
+ <xsl:param name="encoding" select="'UTF-8'"/>
+ <xsl:param name="textToBeEncoded"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('urlencoder:encode')">
+ <xsl:value-of select="urlencoder:encode(normalize-space($textToBeEncoded),$encoding)"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:java.net.URLEncoder.encode')">
+ <xsl:value-of select="java:java.net.URLEncoder.encode(string(normalize-space($textToBeEncoded)),string($encoding))"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- ******************************************************************************************************** -->
+ <!-- *** TRANSFORMATION OF ALL CHILD DOCUMENTS OF THE GLOBAL DOCUMENTS BY USING A EXTERNAL HELPER CLASS *** -->
+ <!-- ******************************************************************************************************** -->
+
+
+ <!-- a new element 'contentTableHeadings' will be added to the helper variable the first time a child will be transformed -->
+ <xsl:template name="transform-global-document-and-children">
+ <xsl:param name="collectedGlobalData"/>
+
+
+ <xsl:choose>
+ <xsl:when test="$collectedGlobalData/content-table-headings">
+ <xsl:call-template name="start-child-transformation">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- The necessary auxiliary variable hasn't build yet.
+ This variable gonna store all headers (with chapter numbers) and the URL of their files -->
+
+ <xsl:call-template name="Create-helper-variables-for-Content-Table">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="start-self-and-children-transformation">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:call-template name="debug-content-table-headings-variable">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ <xsl:message>Parsing the global document...</xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+
+ <xsl:if test="$isDebugMode"><xsl:message>Parsing the child documents...</xsl:message></xsl:if>
+ <xsl:call-template name="start-child-transformation">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ </xsl:template>
+
+
+
+
+ <xsl:template name="start-child-transformation">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:if test="$isDebugMode"><xsl:message>Starting the child transformations...</xsl:message></xsl:if>
+
+ <!-- As the childs of a global document (with suffix .sxg) do not know anything about their global parent,
+ the transformation of global documents children have to be done implizit.
+ Otherwise the chapter number of the children will always start with zero, as they do not know anything about the
+ proceding chapters.
+ Furthermore, they don't have any links about preceeding and following documents and no linking for usability reasons
+ could be done. Therefore the children have to be transformed during the transformation of a global (sxg) document -->
+ <xsl:if test="$isDebugMode">
+ <xsl:choose>
+ <xsl:when test="$collectedGlobalData/content-table-headings">
+ <xsl:message>Contentable data exists as global data!</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>No Contentable global data exists!</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <!-- currently this function only works with node-sets from XT -->
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:transform-children')">
+ <xsl:message>
+ <xsl:value-of select="sxghelper:transform-children( $collectedGlobalData/content-table-headings,
+ string($jaredRootURL),
+ string($absoluteSourceDirRef),
+ string($optionalURLSuffix),
+ string($dpi),
+ string($outputType),
+ $isDebugMode)"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Java method transformChildren to transform all children of a global document could not be found. Be sure to use the XT processor.</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- ******************************************************************************* -->
+ <!-- *** Creation of helper variable of the headings of all children documents *** -->
+ <!-- ******************************************************************************* -->
+
+
+ <xsl:template match="/*/office:body/text:section" mode="creation-of-variable">
+ <xsl:call-template name="getChildRootNode"/>
+
+ <!-- after the last child document the global document will be parsed -->
+ <xsl:if test="position() = last()">
+ <!-- search the global document after all child documents have been searched
+
+ODK PATCH NO INDEX ELEMENT WANTED !! - null pointer exception
+ <xsl:call-template name="getPreviousHeaderNo">
+ <xsl:with-param name="fileURL" select="$contentTableURL"/>
+ <xsl:with-param name="amountOfCurrentHeading" select="count(following-sibling::text:h)"/>
+ <xsl:with-param name="nodeToSearchForHeading" select="following-sibling::text:h"/>
+ </xsl:call-template>
+-->
+ <!-- get the overall No of Headers -->
+ <xsl:call-template name="getAllHeaderNo"/>
+ </xsl:if>
+ </xsl:template>
+
+
+ <xsl:template name="getChildRootNode">
+ <xsl:variable name="fileURL" select="text:section-source/@xlink:href"/>
+
+ <xsl:choose>
+ <!-- if absolute URL or absolute DOS PATH or absolute Unix path -->
+ <xsl:when test="contains($fileURL,'//') or (substring($fileURL,2,1) = ':') or starts-with($fileURL, '/')">
+ <xsl:variable name="childRootNode" select="document($fileURL)"/>
+ <xsl:call-template name="getPreviousHeaderNo">
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <!-- NO absolute source path will be added as prefix -->
+ <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
+ <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="childRootNode" select="document(concat($absoluteSourceDirRef,'/',$fileURL))"/>
+ <xsl:call-template name="getPreviousHeaderNo">
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <!-- the absolute source path will be added as prefix -->
+ <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
+ <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <xsl:template name="getPreviousHeaderNo">
+ <xsl:param name="fileURL"/>
+ <xsl:param name="nodeToSearchForHeading"/>
+ <xsl:param name="amountOfCurrentHeading"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-previous-child-documents-heading-count')">
+ <xsl:call-template name="addHeadingInfo">
+ <xsl:with-param name="nodeToSearchForHeading" select="$nodeToSearchForHeading"/>
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <xsl:with-param name="previousHeader" select="sxghelper:get-previous-child-documents-heading-count($amountOfCurrentHeading)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount')">
+ <xsl:call-template name="addHeadingInfo">
+ <xsl:with-param name="nodeToSearchForHeading" select="$nodeToSearchForHeading"/>
+ <xsl:with-param name="fileURL" select="$fileURL"/>
+ <xsl:with-param name="previousHeader" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount($amountOfCurrentHeading)"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <xsl:template name="addHeadingInfo">
+ <xsl:param name="fileURL"/>
+ <xsl:param name="previousHeader"/>
+ <xsl:param name="nodeToSearchForHeading"/>
+
+ <xsl:variable name="previousHeader2" select="number($previousHeader)"/>
+ <xsl:for-each select="$nodeToSearchForHeading">
+
+ <xsl:variable name="title" select="normalize-space(.)"/>
+
+ <xsl:variable name="encodedTitle">
+ <xsl:call-template name="encode-string">
+ <!-- the space has to be normalized,
+ otherwise an illegal argument exception will be thrown for XT-->
+ <xsl:with-param name="textToBeEncoded" select="$title"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:element name="heading">
+ <!-- odd but 'descendant:text()' didn't work, but '.', to get all text nodes of the header -->
+ <xsl:attribute name="title"><xsl:value-of select="$title"/></xsl:attribute>
+ <xsl:attribute name="encoded-title"><xsl:value-of select="$encodedTitle"/></xsl:attribute>
+ <xsl:attribute name="level"><xsl:value-of select="@text:level"/></xsl:attribute>
+ <xsl:attribute name="file-url"><xsl:value-of select="$fileURL"/></xsl:attribute>
+ <xsl:attribute name="header-no"><xsl:value-of select="position() + $previousHeader2"/></xsl:attribute>
+ </xsl:element>
+ </xsl:for-each>
+
+ </xsl:template>
+
+
+ <xsl:template name="getAllHeaderNo">
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-all-child-documents-heading-count')">
+ <xsl:call-template name="addAllHeaderNoElement">
+ <xsl:with-param name="allHeader" select="sxghelper:get-all-child-documents-heading-count()"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount')">
+ <xsl:call-template name="addAllHeaderNoElement">
+ <xsl:with-param name="allHeader" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount()"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="addAllHeaderNoElement">
+ <xsl:param name="allHeader"/>
+
+ <xsl:element name="heading-count">
+ <xsl:value-of select="$allHeader"/>
+ </xsl:element>
+
+ </xsl:template>
+
+
+ <!-- ******************************************************************************************************* -->
+ <!-- *** Creation of a line of links at the beginning and end of a child document to enhance usability *** -->
+ <!-- ******************************************************************************************************* -->
+
+ <xsl:template name="add-child-document-usability-links">
+ <xsl:element name="center">
+ <xsl:element name="small">
+ <xsl:text>[ </xsl:text>
+
+
+ <xsl:variable name="globalDocumentDir" select="sxghelper:get-global-document-dir()"/>
+ <xsl:variable name="currentChildNo" select="number($contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url]/@child-document-no)"/>
+ <xsl:variable name="earlierDocURL" select="$contentTableHeadings/heading[($currentChildNo - 1) = @child-document-no]/@out-file-url"/>
+<!--
+<xsl:message>from: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
+<xsl:message>to: <xsl:value-of select="$earlierDocURL"/></xsl:message>
+<xsl:message>Is: <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
+ </xsl:call-template>
+</xsl:message>-->
+
+
+ <xsl:if test="$earlierDocURL">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!-- when the links starts with a '#' it's a link to the Content Table-->
+ <xsl:choose>
+ <xsl:when test="starts-with($earlierDocURL, '#')">
+
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="."/>
+ </xsl:call-template>
+<!-- <xsl:value-of select="concat($contentTableURL, $earlierDocURL)"/>-->
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
+ </xsl:call-template>
+<!--
+
+ <xsl:value-of select="concat($globalDocumentDir, $earlierDocURL)"/>-->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:text>Previous document</xsl:text>
+ </xsl:element>
+
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!-- when globalDocumentRefToCurrentFile is unset the current file is the Content Table-->
+ <xsl:choose>
+ <xsl:when test="$globalDocumentRefToCurrentFile">
+ <xsl:variable name="contentTableDir">
+ <xsl:call-template name="get-name-of-table-of-content-document"/>
+ </xsl:variable>
+
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$contentTableDir"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>#</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+<!-- <xsl:value-of select="$contentTableURL"/>-->
+ </xsl:attribute>
+ <xsl:text>Content Table</xsl:text>
+ </xsl:element>
+
+
+ <xsl:variable name="nextDocURL" select="$contentTableHeadings/heading[($currentChildNo + 1) = @child-document-no]/@out-file-url"/>
+ <xsl:if test="$nextDocURL">
+ <xsl:text> | </xsl:text>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!-- when the links starts with a '#' it's a link to the Content Table-->
+ <xsl:choose>
+ <xsl:when test="starts-with($nextDocURL, '#')">
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="."/>
+ </xsl:call-template>
+<!-- <xsl:value-of select="concat($contentTableURL, $nextDocURL)"/>-->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="get-relative-file-ref">
+ <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+ <xsl:with-param name="targetFileRef" select="$nextDocURL"/>
+ </xsl:call-template>
+<!-- <xsl:value-of select="concat($globalDocumentDir, $nextDocURL)"/>-->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:text>Next document</xsl:text>
+ </xsl:element>
+ </xsl:if>
+ <xsl:text> ]</xsl:text>
+ </xsl:element>
+ </xsl:element>
+ </xsl:template>
+
+
+ <xsl:template name="get-relative-file-ref">
+ <xsl:param name="sourceFileRef"/>
+ <xsl:param name="targetFileRef"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-relative-file-ref')">
+ <xsl:value-of select="sxghelper:get-relative-file-ref(string($sourceFileRef), string($targetFileRef))"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef(string($sourceFileRef), string($targetFileRef))"/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <xsl:template name="get-name-of-table-of-content-document">
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:get-name-of-table-of-content-document')">
+ <xsl:value-of select="sxghelper:get-name-of-table-of-content-document()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument()"/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <xsl:template name="debug-content-table-headings-variable">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:message><xsl:text>**** THE HEADING VARIABLE **** </xsl:text></xsl:message>
+ <xsl:message>content-table-url: <xsl:value-of select="collectedGlobalData/content-table-headings/content-table-url"/></xsl:message>
+
+ <xsl:for-each select="$collectedGlobalData/content-table-headings/heading">
+ <xsl:message><xsl:text>**** new heading: </xsl:text></xsl:message>
+ <xsl:message>content-table-id: <xsl:value-of select="@content-table-id"/></xsl:message>
+ <xsl:message>child-document-no: <xsl:value-of select="@child-document-no"/></xsl:message>
+ <xsl:message>file-url: <xsl:value-of select="@file-url"/></xsl:message>
+ <xsl:message>out-file-url: <xsl:value-of select="@out-file-url"/></xsl:message>
+ <xsl:message>level: <xsl:value-of select="@level"/></xsl:message>
+ <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+ <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
+ <xsl:message>absolute-chapter-level:<xsl:value-of select="@absolute-chapter-level"/></xsl:message>
+ </xsl:for-each>
+
+ </xsl:template>
+
+
+ <!-- To make the headings unique, the absolute heading is added to them
+ E.g. The level 1.2.3.4. would result into a 1+2+3+4 string -->
+ <xsl:template name="calc-chapter-numbers">
+ <xsl:param name="level"/>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sxghelper:calc-chapter-numbers')">
+ <xsl:value-of select="sxghelper:calc-chapter-numbers($level)"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers')">
+ <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers($level)"/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+
+
+ <xsl:template match="text:p" mode="content-table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:variable name="allTabStopStyles" select="$office:automatic-styles/style:style[@style:name = current()/@text:style-name]/style:properties/style:tab-stops"/>
+
+ <xsl:element name="table">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="class"><xsl:value-of select="@text:style-name"/></xsl:attribute>
+<!--
+<xsl:message>*********</xsl:message>
+<xsl:message>Stylename:<xsl:value-of select="@text:style-name"/></xsl:message>
+<xsl:message>position: <xsl:value-of select="count($allTabStopStyles/style:tab-stop)"/></xsl:message>
+-->
+
+ <xsl:element name="colgroup">
+ <xsl:call-template name="create-col-element">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:element>
+
+
+ <!-- all elements before the first tabStop -->
+ <xsl:variable name="testNo-RTF">
+ <xsl:apply-templates select="node()" mode="cell-content"/>
+ </xsl:variable>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
+ <xsl:element name="tr">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="position" select="1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:variable name="tabNodePositions" select="xalan:nodeset($testNo-RTF)"/>
+ <xsl:element name="tr">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="position" select="1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
+
+ <xsl:element name="tr">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+ <xsl:with-param name="position" select="1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>-->
+
+
+ </xsl:element>
+ </xsl:template>
+
+
+ <xsl:template name="create-col-element">
+ <xsl:param name="lastNodePosition"/>
+ <xsl:param name="allTabStopStyles"/>
+
+ <xsl:for-each select="$allTabStopStyles/style:tab-stop">
+ <xsl:element name="col">
+ <xsl:attribute name="style">
+ <xsl:text>width: </xsl:text>
+ <xsl:call-template name="grap-cell-width">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:for-each>
+
+ </xsl:template>
+<!--
+Scenarios tabstops
+
+1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
+ -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.
+
+2) style:type is 'right' and earlier tabStop is right
+ -> following text-nodes, will be put into a right aligned TD
+
+3) style:type is 'non-right' and earlier tabStop 'non-right' as well
+ -> put the preceding tab stops into a TD (left aligned is default)
+
+4) first style:type would have no right precedign tabStop
+ -> works well with first sceanrios 1 and 3
+
+5) last style:type would be a special case, if it would be left aligned, but this won't happen in our case.. :D
+
+Scenarios unmatched:
+- text:styleposition 'center' will not be matched in our case (effort for nothing), there will be only 'right' and not 'right'
+- If the last tabStop is not from text:stylepostion 'right', the length of the last cell is undefined and a document length must be found.
+ Not happens in our global document case. Also the algorithm below would have to be expanded (cp. scenario 5).
+
+-->
+ <xsl:template name="create-td-elements">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="lastNodePosition"/>
+ <xsl:param name="position"/>
+ <xsl:param name="allTabStopStyles"/>
+ <xsl:param name="tabNodePositions"/>
+<!--
+<xsl:message>++++++++</xsl:message>
+<xsl:message>Position: <xsl:value-of select="$position"/></xsl:message>
+<xsl:message>lastNodePosition: <xsl:value-of select="$lastNodePosition"/></xsl:message>
+-->
+
+ <xsl:variable name="currentStyleType" select="$allTabStopStyles/style:tab-stop[$position]/@style:type"/>
+ <xsl:variable name="earlierStyleType" select="$allTabStopStyles/style:tab-stop[$position - 1]/@style:type"/>
+ <xsl:choose>
+ <xsl:when test="$currentStyleType = 'right'">
+ <xsl:choose>
+ <xsl:when test="$earlierStyleType = 'right'">
+ <!--
+ 2) style:type is 'right' and earlier tabStop is right
+ -> following text-nodes, will be put into a right aligned TD -->
+ <xsl:element name="td">
+ <xsl:attribute name="style">
+ <xsl:text>align: right</xsl:text>
+ </xsl:attribute>
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ 1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
+ -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.-->
+<!-- valid HTML but browsers make a line break (border=0 and paragraphstyle also missing):
+ <xsl:element name="table">
+ <xsl:element name="td">
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ <xsl:element name="td">
+ <xsl:attribute name="style">
+ <xsl:text>align: right</xsl:text>
+ </xsl:attribute>
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:element>
+-->
+ <xsl:element name="td">
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+<!-- ODK FEATURE NO PAGES
+ <xsl:element name="td">
+ <xsl:attribute name="style">
+ <xsl:text>align: right</xsl:text>
+ </xsl:attribute>
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element> -->
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$earlierStyleType = 'right'">
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ 3) style:type is 'non-right' and earlier tabStop 'non-right' as well
+ -> put the preceding tab stops into a TD (left aligned is default) -->
+ <xsl:element name="td">
+ <xsl:call-template name="grap-cell-content-before-tab-stop">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="endingTabStopPosition" select="$position"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$position != $lastNodePosition">
+ <xsl:call-template name="create-td-elements">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+ <xsl:with-param name="position" select="$position + 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+
+ <xsl:template name="grap-cell-content-before-tab-stop">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="endingTabStopPosition"/>
+ <xsl:param name="tabNodePositions"/>
+ <xsl:param name="lastNodePosition"/>
+
+ <xsl:choose>
+ <xsl:when test="$endingTabStopPosition = 1">
+ <xsl:apply-templates mode="content-table" select="node()[position() < $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]]">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$endingTabStopPosition > $lastNodePosition">
+ <xsl:apply-templates mode="content-table" select="node()[position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="content-table" select="node()[position() < $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]][position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template mode="content-table" match="text:s">
+ <xsl:call-template name="write-breakable-whitespace">
+ <xsl:with-param name="whitespaces" select="@text:c"/>
+ </xsl:call-template>
+ </xsl:template>
+
+
+ <xsl:template match="*" mode="cell-content">
+
+ <xsl:if test="name() = 'text:tab-stop' or *[name() = 'text:tab-stop']">
+ <xsl:element name="tab-stop-node-position">
+ <xsl:value-of select="position()"/>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+
+ <xsl:template name="grap-cell-width">
+ <xsl:param name="position"/>
+ <xsl:param name="allTabStopStyles"/>
+
+ <xsl:variable name="tabStopPosition" select="$allTabStopStyles/style:tab-stop[$position]/@style:position"/>
+ <xsl:choose>
+ <xsl:when test="contains($tabStopPosition, 'cm')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'cm'))"/>
+ <xsl:with-param name="unit" select="'cm'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($tabStopPosition, 'in')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'in'))"/>
+ <xsl:with-param name="unit" select="'in'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($tabStopPosition, 'ch')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'ch'))"/>
+ <xsl:with-param name="unit" select="'ch'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($tabStopPosition, 'pt')">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'pt'))"/>
+ <xsl:with-param name="unit" select="'pt'"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="create-cell-width">
+ <xsl:param name="width"/>
+ <xsl:param name="unit"/>
+ <xsl:param name="position"/>
+ <xsl:param name="allTabStopStyles"/>
+
+ <xsl:choose>
+ <xsl:when test="$position > 1">
+ <xsl:call-template name="create-cell-width">
+ <xsl:with-param name="width" select="$width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit))"/>
+ <xsl:with-param name="unit" select="$unit"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="concat($width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit)), $unit)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($width, $unit)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+ <xsl:output method ="xml"
+ encoding ="UTF-8"
+ indent ="yes"/>
+
+
+
+ <!--+++++ INCLUDED XSL MODULES +++++-->
+ <!-- inherited style properties will be collected and written in a CSS header (CSS) -->
+ <xsl:include href="style_header.xsl"/>
+
+ <!-- inherited style properties will be collected and written as html properties in a temporary variable (HTML4, PALM) -->
+ <xsl:include href="style_inlined.xsl"/>
+
+ <!-- our xml style properties will be mapped to CSS and HTML4.x properties -->
+ <xsl:include href="style_mapping.xsl"/>
+
+ <!-- common element handling -->
+ <xsl:include href="common.xsl"/>
+
+ <!-- table handling -->
+ <xsl:include href="table.xsl"/>
+
+ <!-- palm handling -->
+ <xsl:include href="palm.xsl"/>
+
+ <!-- global document handling -->
+ <xsl:include href="global_document.xsl"/>
+
+
+
+
+
+
+
+ <!--+++++ PARAMETER FROM THE APPLICATION AND GLOBAL VARIABLES +++++-->
+
+ <!-- MANDATORY: URL of meta stream -->
+ <xsl:param name="metaFileURL"/>
+
+ <!-- MANDATORY: URL of styles stream -->
+ <xsl:param name="stylesFileURL"/>
+
+ <!-- MANDATORY: for resolving relative links
+ For resolving realtive links to the packed SO document, i.e. the path/URL of the jared sxw file (e.g. meta.xml, styles.xml, links to graphics in a relative directory) -->
+ <xsl:param name="absoluteSourceDirRef"/>
+
+ <!-- OPTIONAL (mandatory, when when source is compressed): Necessary for the in the packed OO document embedded files (mostly graphics from the compressed /Picture dir).
+ When the OpenOffice (OO) file has been unpacked the absoluteSoureDirRef can be taken,
+ Otherwise, a JAR URL could be choosen or when working with OpenOffice a so called Package-URL encoded over HTTP can be used to
+ access the jared contents of the the jared document. . -->
+ <xsl:param name="jaredRootURL" select="$absoluteSourceDirRef"/>
+
+ <!-- OPTIONAL (mandatory, when used in session based environment)
+ Useful for WebApplications: if a HTTP session is not cookie based, URL rewriting is beeing used (the session is appended to the URL).
+ This URL session is used when creating links to graphics by XSLT. Otherwise the user havt to log again in for every graphic he would like to see. -->
+ <xsl:param name="optionalURLSuffix"/>
+
+ <!-- OPTIONAL: DPI (dots per inch) the standard solution of given pictures (necessary for the conversion of 'cm' into 'pixel')-->
+ <!-- Although many pictures have the 96 dpi resolution, a higher resoltion give better results for common browsers -->
+ <xsl:param name="dpi" select="96"/>
+
+ <!-- OPTIONAL: in case of using a different processor than a JAVA XSLT, you can unable the Java functionality
+ (i.e. debugging time and encoding chapter names for the content-table as href and anchors ) -->
+ <xsl:param name="disableJava" select="false"/>
+ <xsl:param name="isJavaDisabled" select="boolean($disableJava)"/>
+
+ <!-- OPTIONAL: user-agent will be differntiated by this parameter given by application (e.g. java servlet)-->
+ <xsl:param name="outputType" select="'CSS_HEADER'"/>
+ <!-- set of possible deviceTyps (WML is set in its own startfile main_wml.xsl):
+ <xsl:param name="outputType" select="'CSS_HEADER'"/>
+ <xsl:param name="outputType" select="'CSS_INLINED'"/>
+ <xsl:param name="outputType" select="'PALM'"/> -->
+
+ <!-- OPTIONAL: for activating the debug mode set the variable here to 'true()' or give any value from outside -->
+ <xsl:param name="debug" select="false"/>
+ <xsl:param name="isDebugMode" select="boolean($debug)"/>
+
+<!-- *************************************************************************
+ OPTIONAL: NEEDED IN CONNECTION WITH A GLOBAL DOCUMENT -->
+
+ <!--SUMMARY:
+ following parameter triggers a (quite time consuming) enabling of bookmarks in the table-of-content.
+ IN DETAIL:
+ Currently some links used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+ is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+ links in the Office XML.
+ A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
+ can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
+ All header titles gonna be encoding to be usable in a relative URL. -->
+ <xsl:param name="disableLinkedTableOfContent" select="false()"/>
+
+ <!-- The chapter numbers of the current document (as a sequence of a global document) is dependent of the number
+ of chapter of the same level in preceding documents. -->
+ <xsl:param name="precedingChapterLevel1" select="0"/>
+ <xsl:param name="precedingChapterLevel2" select="0"/>
+ <xsl:param name="precedingChapterLevel3" select="0"/>
+ <xsl:param name="precedingChapterLevel4" select="0"/>
+ <xsl:param name="precedingChapterLevel5" select="0"/>
+ <xsl:param name="precedingChapterLevel6" select="0"/>
+ <xsl:param name="precedingChapterLevel7" select="0"/>
+ <xsl:param name="precedingChapterLevel8" select="0"/>
+ <xsl:param name="precedingChapterLevel9" select="0"/>
+ <xsl:param name="precedingChapterLevel10" select="0"/>
+
+ <!-- XML documents containing a table of contents,
+ gonna link for usability reason above each chapter to the preceding and following document and the content table -->
+ <xsl:param name="contentTableURL"/>
+
+ <!-- Needed for the bug workaround of missing content table links
+ by this ambigous HTML references from the content table can be evoided-->
+ <xsl:param name="globalDocumentRefToCurrentFile"/>
+
+ <!-- Needed for the bug workaround of missing content table links
+ by this node-set the relation between content-table link and children document header can be unambigous established -->
+ <xsl:param name="contentTableHeadings"/>
+
+
+<!-- END OF GLOBAL DOCUMENT SECTION
+*************************************************************************-->
+
+
+
+ <!-- works for normal separated zipped xml files as for flat filter single xml file format as well -->
+ <xsl:variable name="office:meta-file" select="document($metaFileURL)"/>
+ <xsl:variable name="office:styles-file" select="document($stylesFileURL)"/>
+ <xsl:variable name="office:font-decls" select="$office:styles-file/*/office:font-decls"/>
+ <xsl:variable name="office:styles" select="$office:styles-file/*/office:styles"/>
+ <!-- office:automatic-styles may occure in two different files (i.d. content.xml and styles.xml). Furthermore the top level tag is different in a flat xml file -->
+ <xsl:variable name="office:automatic-styles" select="/*/office:automatic-styles"/>
+
+ <!-- simple declaration of WML used to avoid parser errors -->
+ <xsl:variable name="wap-paragraph-elements-without-table-row"/>
+ <xsl:variable name="wap-paragraph-elements"/>
+ <xsl:template name="wml-repeat-write-row"/>
+
+
+ <!-- ************************************* -->
+ <!-- *** build the propriate HTML file *** -->
+ <!-- ************************************* -->
+
+ <xsl:template match="/">
+
+ <!--<xsl:message>
+
+
+ Entered the styleSheets, transformation begins... </xsl:message>-->
+
+ <xsl:choose>
+ <xsl:when test="$isDebugMode">
+ <xsl:call-template name="check-parameter"/>
+
+ <xsl:if test="not($isJavaDisabled)">
+ <xsl:call-template name="debug-style-collecting-time"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- to access the variable like a node-set it is necessary to convert it
+ from a result-tree-fragment (RTF) to a node set using the James Clark extension -->
+ <xsl:variable name="collectedGlobalData-RTF">
+ <xsl:call-template name='create-all-inline-styles'/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="start">
+ <xsl:with-param name="collectedGlobalData" select="xt:node-set($collectedGlobalData-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="start">
+ <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($collectedGlobalData-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="NodeSetFunctionNotAvailable"/>
+ <xsl:call-template name="start"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="start">
+ <xsl:param name="collectedGlobalData"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="html">
+ <xsl:element name="head">
+ <xsl:if test="$isDebugMode"><xsl:message>CSS helper variable will be created....</xsl:message></xsl:if>
+ <xsl:call-template name='common-header-properties'/>
+ <xsl:if test="$isDebugMode"><xsl:message>CSS variable ready, header will be created....</xsl:message></xsl:if>
+ <!-- constructing the css header simulating inheritance of style-families by style order -->
+ <xsl:call-template name='create-css-styleheader'/>
+ <xsl:if test="$isDebugMode"><xsl:message>CSS header creation finished!</xsl:message></xsl:if>
+ </xsl:element>
+
+
+
+ <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
+ <xsl:element name="body">
+ <!-- background image -->
+ <xsl:if test="$backgroundImageURL">
+ <xsl:attribute name="background">
+ <xsl:choose>
+ <!-- for images jared in open office document -->
+ <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
+ <!-- creating an absolute http URL to the contained/packed image file -->
+ <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- processing the content of the xml file -->
+ <xsl:apply-templates select="/*/office:body">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINING +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="html">
+ <xsl:element name="head">
+ <xsl:call-template name='common-header-properties'/>
+ </xsl:element>
+
+ <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
+ <xsl:element name="body">
+ <!-- background image -->
+ <xsl:if test="$backgroundImageURL">
+ <xsl:attribute name="background">
+ <xsl:choose>
+ <!-- for images jared in open office document -->
+ <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
+ <!-- creating an absolute http URL to the contained/packed image file -->
+ <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="/*/office:body">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ PALM-VII (3.2 HTML SUBSET) +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <!-- the proxy will convert the html file later to PQA -->
+ <xsl:element name="html">
+ <xsl:element name="head">
+ <xsl:call-template name='palm-header-properties'/>
+ </xsl:element>
+
+ <xsl:element name="body">
+ <!-- processing the content of the xml file -->
+ <xsl:apply-templates select="/*/office:body">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:element>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <!-- ********************************************* -->
+ <!-- *** Header for CSS_INLINED and CSS_HEADER *** -->
+ <!-- ********************************************* -->
+
+ <xsl:template name='common-header-properties'>
+ <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:title"/>
+ <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:description"/>
+<!--2DO add further header elements..
+ <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:subject"/>
+ <xsl:apply-templates select="$office:meta-file/*/office:meta/meta:keywords[postition()=1]"/>-->
+ </xsl:template>
+
+ <xsl:template match="dc:title">
+ <xsl:element name="title">
+ <xsl:value-of select="."/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="dc:description">
+ <xsl:element name="meta">
+ <xsl:attribute name="name">
+ <xsl:text>description</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="content">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:template>
+
+
+ <!-- ********************************************* -->
+ <!-- *** Measuring the time for style creating *** -->
+ <!-- ********************************************* -->
+
+
+ <xsl:template name="debug-style-collecting-time">
+
+ <xsl:variable name="startTime-RTF">
+ <xsl:choose>
+ <xsl:when test="function-available('system:current-time-millis')">
+ <xsl:value-of select="system:current-time-millis()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
+ <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+
+
+ <xsl:variable name="collectedGlobalData-RTF">
+ <xsl:call-template name='create-all-inline-styles'/>
+ </xsl:variable>
+
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:message>Creating the inline styles....</xsl:message>
+ <xsl:variable name="startTime" select="number(xt:node-set($startTime-RTF))"/>
+ <xsl:variable name="collectedGlobalData" select="xt:node-set($collectedGlobalData-RTF)"/>
+ <xsl:variable name="endTime" select="system:current-time-millis()"/>
+
+ <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
+ <xsl:call-template name="start">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:message>Creating the inline styles....</xsl:message>
+ <xsl:variable name="startTime" select="number(xalan:nodeset($startTime-RTF))"/>
+ <xsl:variable name="endTime" select="java:java.lang.System.currentTimeMillis()"/>
+ <xsl:variable name="collectedGlobalData" select="xalan:nodeset($collectedGlobalData-RTF)"/>
+
+ <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
+ <xsl:call-template name="start">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <!-- DEBUG purpose only: checking the parameters of this template-->
+ <xsl:template name="check-parameter">
+ <xsl:message>Parameter dpi: <xsl:value-of select="$dpi"/></xsl:message>
+ <xsl:message>Parameter metaFileURL: <xsl:value-of select="$metaFileURL"/></xsl:message>
+ <xsl:message>Parameter stylesFileURL: <xsl:value-of select="$stylesFileURL"/></xsl:message>
+ <xsl:message>Parameter absoluteSourceDirRef: <xsl:value-of select="$absoluteSourceDirRef"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel1 : <xsl:value-of select="$precedingChapterLevel1"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel2 : <xsl:value-of select="$precedingChapterLevel2"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel3 : <xsl:value-of select="$precedingChapterLevel3"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel4 : <xsl:value-of select="$precedingChapterLevel4"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel5 : <xsl:value-of select="$precedingChapterLevel5"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel6 : <xsl:value-of select="$precedingChapterLevel6"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel7 : <xsl:value-of select="$precedingChapterLevel7"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel8 : <xsl:value-of select="$precedingChapterLevel8"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel9 : <xsl:value-of select="$precedingChapterLevel9"/></xsl:message>
+ <xsl:message>Parameter precedingChapterLevel10: <xsl:value-of select="$precedingChapterLevel10"/></xsl:message>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+ <xsl:output cdata-section-elements="meta"/>
+
+
+ <!-- **************************** -->
+ <!-- *** specific palm header *** -->
+ <!-- **************************** -->
+
+ <xsl:template name='palm-header-properties'>
+ <xsl:element name="meta">
+ <xsl:attribute name="name">PalmComputingPlatform</xsl:attribute>
+ <xsl:attribute name="content">true</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="meta">
+ <xsl:attribute name="name">HandheldFriendly</xsl:attribute>
+ <xsl:attribute name="content">true</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="meta">
+ <xsl:attribute name="name">HistoryListText</xsl:attribute>
+ <xsl:attribute name="content">Dateimanager : &date &time</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="meta">
+ <xsl:attribute name="name">description</xsl:attribute>
+ <xsl:attribute name="content">StarPortal</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="meta">
+ <xsl:attribute name="name">keywords</xsl:attribute>
+ <xsl:attribute name="content">starportal, staroffice, software</xsl:attribute>
+ </xsl:element>
+ <xsl:element name="meta">
+ <xsl:attribute name="http-equiv">Content-Type</xsl:attribute>
+ <xsl:attribute name="content">text/html; charset=iso-8859-1</xsl:attribute>
+ </xsl:element>
+ </xsl:template>
+
+
+ <!-- ********************************* -->
+ <!-- *** creating table attributes *** -->
+ <!-- ********************************* -->
+
+ <!-- table data (td) and table header (th) attributes -->
+ <xsl:template name="create-attribute-ALIGN">
+ <xsl:param name="styleProperties"/>
+
+ <xsl:if test="contains($styleProperties, 'align')">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'align:left')">
+ <xsl:text>left</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($styleProperties, 'align:right')">
+ <xsl:text>right</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>center</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+
+ <!-- ********************************* -->
+ <!-- *** creating List attributes *** -->
+ <!-- ********************************* -->
+<!--
+ <xsl:template name="create-list-attributes">
+ <xsl:param name="styleProperties"/>
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+2 be implemented
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+ </xsl:template>
+-->
+
+ <!-- ************************************************ -->
+ <!-- *** creating nested format tags (PALM & WML) *** -->
+ <!-- ************************************************ -->
+
+ <!-- Italic -->
+ <xsl:template name="create-nested-format-tags">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'italic')">
+ <xsl:element name="i">
+ <xsl:call-template name="bold">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- Bold -->
+ <xsl:template name="bold">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'bold')">
+ <xsl:element name="b">
+ <xsl:call-template name="underline">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="underline">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- Underline : last format attribute, which is also used from WML - WML ends here! -->
+ <xsl:template name="underline">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+
+ <xsl:choose>
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'underline')">
+ <xsl:element name="u">
+ <xsl:call-template name="strikethrough">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="strikethrough">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'underline')">
+ <xsl:element name="u">
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- strikethrough -->
+ <xsl:template name="strikethrough">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'strike')">
+ <xsl:element name="strike">
+ <xsl:call-template name="align">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="align">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- Alignment -->
+ <xsl:template name="align">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'align')">
+ <xsl:element name="div">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'align:left')">
+ <xsl:text>left</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($styleProperties, 'align:right')">
+ <xsl:text>right</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>center</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:call-template name="font_combined">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="font_combined">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- Both size and Color for font -->
+ <xsl:template name="font_combined">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'color') and contains($styleProperties, 'size')">
+ <xsl:element name="font">
+
+ <xsl:attribute name="color">
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'color:#000000')">
+ <xsl:text>#000000</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>#FFFFFF</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:attribute name="size">
+ <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
+ </xsl:attribute>
+
+ <!-- get the embedded content -->
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="font_simple">
+ <xsl:with-param name="styleProperties" select="$styleProperties"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- size or Color for font -->
+ <xsl:template name="font_simple">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="styleProperties"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'color')">
+ <xsl:element name="font">
+ <xsl:attribute name="color">
+ <xsl:choose>
+ <xsl:when test="contains($styleProperties, 'color:#000000')">
+ <xsl:text>#000000</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>#FFFFFF</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <!-- get the embedded content -->
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:when test="contains($styleProperties, 'size')">
+ <xsl:element name="font">
+ <xsl:attribute name="size">
+ <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
+ </xsl:attribute>
+
+ <!-- get the embedded content -->
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- get the embedded content -->
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+
+ <!-- ****************************** -->
+ <!-- *** style sheet processing *** -->
+ <!-- ****************************** -->
+
+
+ <xsl:template name='create-css-styleheader'>
+ <xsl:comment>
+ <xsl:text>The CSS style header method for setting styles</xsl:text>
+ </xsl:comment>
+ <xsl:element name="style">
+ <xsl:attribute name="type">text/css</xsl:attribute>
+ <xsl:comment>
+ <xsl:text>
+
+ </xsl:text>
+ <xsl:call-template name="write-default-styles"/>
+
+ <!-- THE STYLE PROPERTIES OF THE FIRST WRITTEN STYLE (PARENT) IS GIVEN OUT -->
+
+ <!-- 1) styles from office:styles are possible parent from all (itself or office:automatic-styles).
+ Therefore they are created first.
+ Beginning with the top-level parents (the styles without any parent). -->
+ <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
+
+ <xsl:call-template name="write-styleproperty-line"/>
+ <xsl:call-template name="write-styleproperty-lines-for-children"/>
+ </xsl:for-each>
+
+ <xsl:text> </xsl:text>
+
+ <!-- 2) styles from office:automatic-styles can only be parent of styles from the office:automatic-styles section.
+ Beginning with top-level styles, again, all children style will be recursivly traversed -->
+ <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
+ <xsl:call-template name="write-styleproperty-line">
+ <xsl:with-param name="searchOnlyInAutomaticStyles" select="true()"/>
+ </xsl:call-template>
+ <xsl:call-template name="write-styleproperty-lines-for-children">
+ <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ //</xsl:comment>
+ </xsl:element>
+ </xsl:template>
+
+
+ <xsl:template name='write-styleproperty-line'>
+ <xsl:param name="searchOnlyInAutomaticStyles"/>
+
+ <xsl:variable name="styleProperties">
+ <xsl:call-template name="write-style-properties">
+ <xsl:with-param name="styleAttributePath" select="current()/style:properties/@*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- do not write styles with no css property -->
+ <xsl:if test="not(string-length($styleProperties) = 0)">
+ <!-- write out the name of the current (parent) style in the CSS headersection (e.g. "span.myStyle") -->
+ <xsl:call-template name="write-style-name">
+ <xsl:with-param name="is-parent-style" select="true()"/>
+ </xsl:call-template>
+
+ <!-- the names of all styles children will be written out(office:style AND office:automatic-style) -->
+ <xsl:call-template name="write-children-style-names">
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+ </xsl:call-template>
+
+ <!-- the style properties of the first written style (parent) is given out -->
+ <xsl:text> {
+ </xsl:text>
+ <xsl:value-of select="$styleProperties"/>
+ <xsl:text>}
+ </xsl:text>
+
+ </xsl:if>
+
+
+
+ </xsl:template>
+
+
+
+
+ <!-- RECURSION WITH ENDCONDITON: adding style classes for all existing childs -->
+ <xsl:template name='write-styleproperty-lines-for-children'>
+ <xsl:param name="searchOnlyInAutomaticStyles"/>
+
+ <xsl:variable name="parentStyleName" select="@style:name"/>
+ <xsl:variable name="parentStyleFamily" select="@style:family"/>
+
+ <xsl:if test="not(searchOnlyInAutomaticStyles)">
+ <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+ <xsl:call-template name="write-styleproperty-line"/>
+ <xsl:call-template name="write-styleproperty-lines-for-children"/>
+ </xsl:for-each>
+ </xsl:if>
+ <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+ <xsl:call-template name="write-styleproperty-line">
+ <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+ </xsl:call-template>
+ <xsl:call-template name="write-styleproperty-lines-for-children">
+ <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:template>
+
+
+ <xsl:template name="write-default-styles">
+
+ <!-- some default attributes in xml have to be explicitly set in HTML (e.g. margin-top="0") -->
+ <xsl:text>*.OOo_defaults</xsl:text>
+
+ <xsl:for-each select="$office:styles/style:style">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+ </xsl:for-each>
+
+ <xsl:for-each select="$office:automatic-styles/style:style">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+ </xsl:for-each>
+ <!-- 2DO: the defaults might be better collected and written in a separated (XML) file -->
+<xsl:text> {
+ margin-top:0cm; margin-bottom:0cm; }
+ </xsl:text>
+
+ <xsl:for-each select="$office:styles/style:default-style">
+ <xsl:call-template name="write-default-style"/>
+ </xsl:for-each>
+
+ <xsl:for-each select="$office:automatic-styles/style:default-style">
+ <xsl:call-template name="write-default-style"/>
+ </xsl:for-each>
+
+ </xsl:template>
+
+
+
+ <xsl:template name="write-default-style">
+ <xsl:variable name="family-style" select="@style:family"/>
+
+ <!-- some default attributes for format families (e.g. graphics, paragraphs, etc.) written as style:default-style -->
+ <xsl:value-of select="concat('*.', translate($family-style, '. %()/\', ''), '_defaults')"/>
+
+ <xsl:for-each select="$office:styles/style:style[@style:family = $family-style]">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+ </xsl:for-each>
+
+ <xsl:for-each select="$office:automatic-styles/style:style[@style:family = $family-style]">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+ </xsl:for-each>
+
+
+ <xsl:variable name="styleProperties">
+ <xsl:call-template name="write-style-properties">
+ <xsl:with-param name="styleAttributePath" select="current()/style:properties/@*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- do not write styles with no css property -->
+ <xsl:if test="not(string-length($styleProperties) = 0)">
+ <!-- the style properties of the first written style (parent) is given out -->
+ <xsl:text> {
+ </xsl:text>
+ <xsl:value-of select="$styleProperties"/>
+ <xsl:text>}
+ </xsl:text>
+ </xsl:if>
+
+ </xsl:template>
+
+
+ <!--++
+ The parent style will be written out!
+ For each Style:family a prefix must be added
+ <!ENTITY % styleFamily
+ "(paragraph|text|section|table|table-column|table-row|table-cell|table-page|chart|graphics|default|drawing-page|presentation|control)">
+ ++-->
+ <xsl:template name="write-style-name">
+ <xsl:param name="is-parent-style"/>
+
+ <!-- This construct is for list elements. Whenever a paragraph element is being used as child of a list element the name paragraph style is been used for
+ the list item. This can be switched as the paragaph style-name and the list-style-name are in the same element.
+ Otherwise there would be formatting errors (e.g. margin-left will be used for the content in the list elment and not for the list element itself). -->
+ <xsl:variable name="style-name">
+ <xsl:choose>
+ <xsl:when test="@style:list-style-name">
+ <xsl:value-of select="@style:list-style-name"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@style:name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="not($is-parent-style)">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+
+ <xsl:choose>
+ <!-- normally 'p.' would be used as CSS element,
+ but header (h1, h2,...) are also from the style:family paragraph -->
+ <xsl:when test="@style:family='paragraph'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='text'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='section'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='table'">
+ <xsl:value-of select="concat('table.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='table-column'">
+ <!-- as column styles have to be included as span styles AFTER the table (no two class attributes in TD allowed -->
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='table-row'">
+ <xsl:value-of select="concat('tr.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='table-cell'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='table-page'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='chart'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='graphics'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='default'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='drawing-page'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='presentation'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ <xsl:when test="@style:family='control'">
+ <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- finding all style child of a section and give their styleIdentifier to the output -->
+ <xsl:template name='write-children-style-names'>
+ <xsl:param name="parentStyleName" select="@style:name"/>
+ <xsl:param name="parentStyleFamily" select="@style:family"/>
+ <xsl:param name="searchOnlyInAutomaticStyles"/>
+
+
+ <!--** the names of all office:styles children will be written out
+ ** (a automatic style can only have children in the office:automatic-style section) -->
+
+ <!-- if NOT called from a office:automatic-style parent -->
+ <xsl:if test="not(searchOnlyInAutomaticStyles)">
+ <!-- for all children in the office:style section -->
+ <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+ <!-- write the style name in the css header -->
+ <xsl:call-template name="write-style-name"/>
+
+ <!-- search for child styles -->
+ <xsl:call-template name="write-children-style-names">
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ </xsl:call-template>
+
+ </xsl:for-each>
+ </xsl:if>
+
+ <!--** the names of all office:automatic-styles children will be written out -->
+
+ <!-- for all children in the office:automatic-style section -->
+ <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+ <!-- write the style name in the css header -->
+ <xsl:call-template name="write-style-name"/>
+
+ <!-- search for child styles -->
+ <xsl:call-template name="write-children-style-names">
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+ </xsl:call-template>
+
+ </xsl:for-each>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+
+ <!-- ********************************************* -->
+ <!-- *** hard attributed (inlined) properties *** -->
+ <!-- ********************************************* -->
+
+
+ <!-- RESTRICTIONS:
+ 1) As the styles-node-variables are NOT global, the style variables are not global, either!!
+ 2) As a list of elements can only be added to a variable as a result tree fragment the
+ extension is neccessary!!
+ -->
+
+ <!-- 2DO: Inline styles do not inherit from XML office defaults nor font:family defaults as the style header does
+ (cp. stylesheet 'style_header.xsl' and the 'write-default-styles' template) -->
+
+ <xsl:template name='create-all-inline-styles'>
+
+ <!--** traversee all style trees and their branches collecting style properties **-->
+ <xsl:element name="allstyles">
+ <!--** traversee all office:styles trees beginning with the top-level styles**-->
+ <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
+
+ <!--** give out the style properties of the parent node **-->
+ <xsl:call-template name='write-current-and-inherited-style-properties'>
+ <xsl:with-param name="styles-node" select="$office:styles"/>
+ <xsl:with-param name="style-family" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+
+ <!--** all office:styles children of the current top-level office:styles **-->
+ <xsl:call-template name='for-all-templates-child-styles'>
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+
+ <!--** all office:automatic-styles children of the current top-level style **-->
+ <xsl:call-template name='for-all-automatic-child-styles'>
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+
+ <!--** traversee all office:automatic-styles trees beginning with the top-level styles **-->
+ <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
+ <!--** give out the style properties of the parent node **-->
+ <xsl:call-template name='write-current-and-inherited-style-properties'>
+ <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
+ <xsl:with-param name="style-family" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+
+ <!--** all children of the top-level office:automatic-styless **-->
+ <xsl:call-template name='for-all-automatic-child-styles'>
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:template>
+
+
+
+ <xsl:template name='for-all-templates-child-styles'>
+ <xsl:param name="parentStyleName"/>
+ <xsl:param name="parentStyleFamily"/>
+ <xsl:param name="style-name-tokenized"/>
+
+ <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+ <!--** give out the style properties of the current node **-->
+ <xsl:element name="{$style-name-tokenized}">
+ <xsl:call-template name='write-current-and-inherited-style-properties'>
+ <xsl:with-param name="styles-node" select="$office:styles"/>
+ <xsl:with-param name="style-family" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ <!--** for all template-children of the current office:styles **-->
+ <xsl:call-template name='for-all-templates-child-styles'>
+ <xsl:with-param name="styles-node" select="$office:styles"/>
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+
+ <!--** for all automatic-children of the current office:styles **-->
+ <xsl:call-template name='for-all-automatic-child-styles'>
+ <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+
+ </xsl:for-each>
+ </xsl:template>
+
+
+
+ <xsl:template name='for-all-automatic-child-styles'>
+ <xsl:param name="styles-node"/>
+ <xsl:param name="parentStyleName"/>
+ <xsl:param name="parentStyleFamily"/>
+ <xsl:param name="style-name-tokenized"/>
+
+ <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+ <!--** give out the style properties of the current node **-->
+ <xsl:element name="{$style-name-tokenized}">
+ <xsl:call-template name='write-current-and-inherited-style-properties'>
+ <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
+ <xsl:with-param name="style-family" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ <!--** for all automatic-children of the current office:automatic-styles **-->
+ <xsl:call-template name='for-all-automatic-child-styles'>
+ <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
+ <xsl:with-param name="parentStyleName" select="@style:name"/>
+ <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+ <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:template>
+
+
+ <xsl:template name='write-current-and-inherited-style-properties'>
+ <xsl:param name="style-family"/>
+ <xsl:param name="styles-node"/>
+ <xsl:param name="style-name-tokenized"/>
+
+ <xsl:element name="{$style-name-tokenized}">
+ <xsl:variable name="current-style-name" select="@style:name"/>
+ <xsl:variable name="parent-style-name" select="@style:parent-style-name"/>
+
+ <xsl:variable name="new-property-list">
+ <!--*** COLLECT STYLE ATTRIBUTES (only toplevel) ***-->
+ <xsl:call-template name="write-style-properties">
+ <xsl:with-param name="styleAttributePath" select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <!--*** @End: GIVE OUT All COLLECTED STYLE ATTRIBUTES (only toplevel) ***-->
+ <xsl:when test="string-length($parent-style-name)=0">
+ <!--** if no styleParent is given, the properties are given out at once **-->
+ <xsl:value-of select="normalize-space($new-property-list)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="new-property-names">
+ <xsl:for-each select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*">
+ <xsl:value-of select="name()"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <!--** further attributes of the parent style must be collected **-->
+ <xsl:call-template name="add-parent-style-attributes">
+ <xsl:with-param name="property-name-list" select="$new-property-names"/>
+ <xsl:with-param name="complete-property-list" select="normalize-space($new-property-list)"/>
+ <xsl:with-param name="current-style-name" select="$current-style-name"/>
+ <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
+ <xsl:with-param name="style-family" select="$style-family"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:template>
+
+
+
+ <xsl:template name="add-parent-style-attributes">
+ <xsl:param name="property-name-list"/>
+ <xsl:param name="complete-property-list"/>
+ <xsl:param name="current-style-name"/>
+ <xsl:param name="parent-style-name"/>
+ <xsl:param name="style-family"/>
+
+ <!--*** New two be added property names will be collected (only one variable per template) ***-->
+ <xsl:variable name="new-property-names">
+ <xsl:call-template name="get-new-style-names">
+ <xsl:with-param name="property-name-list" select="$property-name-list"/>
+ <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
+ <xsl:with-param name="current-style-name" select="$current-style-name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!--*** check if the new parent style exist in the office:automatic-styles section (defined by name and family) ***-->
+ <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$current-style-name]">
+ <!--*** RECURSION: adding new parent style attributes to the current style ***-->
+ <xsl:variable name="new-property-attributes">
+ <xsl:call-template name="get-new-style-attributes">
+ <xsl:with-param name="new-property-names" select="$new-property-names"/>
+ <xsl:with-param name="current-style-name" select="$current-style-name"/>
+ <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!--*** End CONDITION: the last style parent has already been executed ***-->
+ <xsl:variable name="new-parent-style-name" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
+ <xsl:choose>
+ <xsl:when test="string-length($new-parent-style-name)=0">
+ <!--** no further parent is found, the given parameter property-node is the final style -->
+ <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--** further attributes of the parent style must be collected **-->
+ <xsl:call-template name="add-parent-style-attributes">
+ <xsl:with-param name="property-name-list" select="concat($property-name-list, $new-property-names)"/>
+ <xsl:with-param name="complete-property-list" select="concat($complete-property-list,$new-property-attributes)"/>
+ <xsl:with-param name="current-style-name" select="$parent-style-name"/>
+ <xsl:with-param name="parent-style-name" select="$new-parent-style-name"/>
+ <xsl:with-param name="style-family" select="$style-family"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!--** the specific style (defined by name and family) must be found in the office:styles section -->
+ <xsl:otherwise>
+ <!--*** RECURSION: adding new parent style attributes to the current style ***-->
+ <!--*** adding new parent style attributes to the current style ***-->
+ <xsl:variable name="new-property-attributes">
+ <xsl:call-template name="get-new-style-attributes">
+ <xsl:with-param name="new-property-names" select="$new-property-names"/>
+ <xsl:with-param name="current-style-name" select="$current-style-name"/>
+ <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!--*** End CONDITION: the last style parent has already been executed ***-->
+ <xsl:variable name="new-parent-style-name" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
+ <xsl:choose>
+ <xsl:when test="string-length($new-parent-style-name)=0">
+ <!--** no further parent is found, the given parameter property-node is the final style -->
+ <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--** further attributes of the parent style must be collected ** -->
+ <xsl:call-template name="add-parent-style-attributes">
+ <xsl:with-param name="property-name-list" select="concat($property-name-list, $new-property-names)"/>
+ <xsl:with-param name="complete-property-list" select="concat($complete-property-list,$new-property-attributes)"/>
+ <xsl:with-param name="current-style-name" select="$parent-style-name"/>
+ <xsl:with-param name="parent-style-name" select="$new-parent-style-name"/>
+ <xsl:with-param name="style-family" select="$style-family"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="get-new-style-names">
+ <xsl:param name="property-name-list"/>
+ <xsl:param name="parent-style-name"/>
+ <xsl:param name="current-style-name"/>
+ <!--** where to find the specific style (defined by name and family) wheter in office:automatic-styles or office:styles section -->
+ <xsl:choose>
+ <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
+ <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
+ <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+
+ <xsl:variable name="new-property-name-list">
+ <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
+ <xsl:value-of select="name()"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:value-of select="$new-property-name-list"/>
+ </xsl:when>
+ <!--** the specific style (defined by name and family) should be found in the office:styles section -->
+ <xsl:otherwise>
+ <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+ <xsl:variable name="new-property-name-list">
+ <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
+ <xsl:value-of select="name()"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:value-of select="$new-property-name-list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="get-new-style-attributes">
+ <xsl:param name="new-property-names"/>
+ <xsl:param name="current-style-name"/>
+ <xsl:param name="parent-style-name"/>
+
+ <!--** where to find the specific style (defined by name and family) whether in office:automatic-styles or office:styles section -->
+ <xsl:choose>
+ <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
+ <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
+ <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+ <xsl:variable name="new-property-name-list">
+ <xsl:call-template name="write-style-properties">
+ <xsl:with-param name="styleAttributePath" select="$parent-property-node/@*[contains($new-property-names, name())]"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($new-property-name-list)"/>
+ </xsl:when>
+ <!--** otherwise the specific style (defined by name and family) should be found in the office:styles section -->
+ <xsl:otherwise>
+ <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+ <xsl:variable name="new-property-name-list">
+ <xsl:call-template name="write-style-properties">
+ <xsl:with-param name="styleAttributePath" select="$parent-property-node/@*[contains($new-property-names, name())]"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($new-property-name-list)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+ <xsl:template name="write-style-properties">
+ <xsl:param name="styleAttributePath"/>
+
+ <xsl:choose>
+ <!--+++++ CSS PROPERTIES +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
+
+ <xsl:for-each select="$styleAttributePath">
+ <!-- isDebugModeMESSAGE:
+ <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message> -->
+
+
+ <!-- <!ATTLIST style:properties style:horizontal-pos (from-left|left|center|right|from-inside|inside|outside)#IMPLIED>-->
+ <!-- 2DO: is inside/from-inside also better showable ? -->
+ <!-- !!!! 2DO: Still there have to be placed a <br clear='all'/> to disable the flow!!!!-->
+ <!-- The OOo attribute 'style:number-wrapped-paragraphs' is currently ignored -->
+ <xsl:choose>
+ <xsl:when test='name(.)="style:wrap"'>
+ <xsl:choose>
+ <xsl:when test='.="left"'>
+ <xsl:text>float: right; </xsl:text>
+ </xsl:when>
+ <xsl:when test='.="right"'>
+ <xsl:text>float: left; </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='name(.) = "style:horizontal-pos"'>
+ <xsl:choose>
+ <xsl:when test='.="left"'>
+ <xsl:text>align: left; </xsl:text>
+ </xsl:when>
+ <xsl:when test='.="right"'>
+ <xsl:text>align: right; </xsl:text>
+ </xsl:when>
+ <xsl:when test='.="center"'>
+ <xsl:text>align: center; </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+<!-- results into a bad view (overlapped) in Mozilla 1.0
+ <xsl:when test='name(.) = "table:align"'>
+ <xsl:choose>
+ <xsl:when test='.="left"'>
+ <xsl:text>float: right; </xsl:text>
+ </xsl:when>
+ <xsl:when test='.="right"'>
+ <xsl:text>float: left; </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+-->
+
+ <!-- PADDING for all variations: fo:padding, fo:padding-top, fo:padding-bottom, fo:padding-left, fo:padding-right -->
+ <xsl:when test='contains(name(.),"fo:padding")'>
+ <xsl:text>padding: </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>; </xsl:text>
+ </xsl:when>
+ <!--
+ fo:border
+ fo:border-top
+ fo:border-bottom
+ fo:border-left
+ fo:border-right
+
+ At present, all four borders must be set simultaneously by using either
+ the fo:border property or by attaching all four of the other border
+ properties to an item set element. In the latter case, if one or more
+ of the properties is missing their values are assumed to be none. The
+ only border styles supported are none or hidden, solid, and double. Any
+ other border style specified is displayed as solid. Transparent borders
+ are not supported and the border widths thin, medium, and thick are
+ mapped to lengths. In addition, only some distinct border widths are
+ supported. Unsupported widths are rounded up to the next supported
+ width.
+ If there are no padding properties specified within the same
+ item set element, a default padding is used for sides that have a
+ border. A value of 0cm is used for sides without a border.
+ (cp. wd-so-xml-text.sdw)
+ -->
+
+<!--2DO START: change measurement equally -->
+ <xsl:when test='name(.)="fo:border"'>
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,'ch ')"/><xsl:text>; </xsl:text>
+ <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
+ <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(., 'cm')">
+ <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
+ <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
+ <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(., 'pt')">
+ <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
+ <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
+ <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:border-top"'>
+ <xsl:text>border-top: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:border-bottom"'>
+ <xsl:text>border-bottom: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:border-left"'>
+ <xsl:text>border-left: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:border-right"'>
+ <xsl:text>border-right: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="style:column-width"'>
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='name(.)="style:row-height"'>
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:width"'>
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+<!--2DO END: change measurement equally -->
+ <xsl:when test='name(.)="fo:font-style"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="style:font-name"'>
+ <xsl:text>font-family:</xsl:text>
+ <xsl:variable name="content" select="."/>
+ <xsl:value-of select="$office:font-decls/style:font-decl[@style:name=$content]/@fo:font-family"/>
+ <xsl:text>; </xsl:text>
+ <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Italic')">
+ <xsl:text>font-style:italic; </xsl:text>
+ </xsl:if>
+ <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Bold')">
+ <xsl:text>font-weight:bold; </xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:font-weight"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:font-size"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:font-family"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:color"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:margin-left"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:margin-right"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:margin-top"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:margin-bottom"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:line-height"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:text-align"'>
+ <!-- IMPORTANT is necessary as table cell value alignment is decided by runtime over the valuetype
+ Otherwise a table cell style-class will ALWAYS be overwritten by the run-time value -->
+ <xsl:choose>
+ <xsl:when test="contains(., 'start')">
+ <xsl:text>text-align:left ! important; </xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(., 'end')">
+ <xsl:text>text-align:right ! important; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>text-align:</xsl:text><xsl:value-of select='.'/><xsl:text> ! important; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:text-indent"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="style:text-background-color"'>
+ <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="fo:background-color"'>
+ <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="style:background-image"'>
+ <xsl:text>background-image:url(</xsl:text><xsl:value-of select="@xlink:href"/><xsl:text>); </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@style:repeat = 'repeat'">
+ <xsl:text>background-repeat:repeat; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>background-repeat:no-repeat; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- text-shadow is a CSS2 feature and yet not common used in user-agents -->
+ <xsl:when test='name(.)="fo:text-shadow"'>
+ <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="style:text-crossing-out"'>
+ <xsl:if test='not(.="none")'>
+ <xsl:text>text-decoration:line-through; </xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test='name(.)="style:text-underline"'>
+ <xsl:if test='not(.="none")'>
+ <xsl:text>text-decoration:underline; </xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test='name(.)="style:text-position"'>
+ <xsl:if test='contains(., "sub")'>
+ <xsl:text>vertical-align:sub; </xsl:text>
+ </xsl:if>
+ <xsl:if test='contains(., "sup")'>
+ <xsl:text>vertical-align:sup; </xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <!-- isDebugModeMESSAGE:
+ <xsl:otherwise>
+ <xsl:message>No transformation implemented for attribute-typ <xsl:value-of select="name(.)"/></xsl:message>
+ </xsl:otherwise>-->
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ <!--+++++ PALM 3.2 SUBSET AND WAP PROPERTIES +++++-->
+ <xsl:otherwise>
+ <xsl:for-each select="$styleAttributePath">
+ <!-- isDebugModeMESSAGE:
+ <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message> -->
+
+ <!-- BUG WORK AROUND:
+ Due to a bug in the XT Processor, it is not possible to create serveral elements in variable and search over them,
+ after explicit conversion to nodeset
+ This generated sting identifier shall be later changed back to a set of elements
+ -->
+ <xsl:choose>
+ <!--*** FORMAT ATTRIBUTES ***-->
+
+ <!-- Italic -->
+ <xsl:when test='name(.)="fo:font-style"'>
+ <xsl:if test="contains(., 'italic') or contains(., 'oblique')">
+ <xsl:text>italic, </xsl:text>
+ </xsl:if>
+ </xsl:when>
+
+ <!-- Boldface -->
+ <xsl:when test='name(.)="fo:font-weight"'>
+ <xsl:if test="contains(., 'bold') or contains(., 'bolder')">
+ <xsl:text>bold, </xsl:text>
+ </xsl:if>
+ </xsl:when>
+
+ <!-- Underline -->
+ <xsl:when test='name(.)="style:text-underline"'>
+ <xsl:text>underline, </xsl:text>
+ </xsl:when>
+
+ <!-- Alignment -->
+ <xsl:when test='name(.)="fo:text-align"'>
+ <xsl:choose>
+ <xsl:when test="contains(., 'start')">
+ <xsl:text>align:left, </xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(., 'end')">
+ <xsl:text>align:right, </xsl:text>
+ </xsl:when>
+ <xsl:when test="contains(., 'center')">
+ <xsl:text>align:center, </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- strikethrough -->
+ <xsl:when test='name(.)="style:text-crossing-out"'>
+ <xsl:text>strike, </xsl:text>
+ </xsl:when>
+
+ <!-- Font - size (Palm: emulator transformed sizes to available set (e.g. 30 to (probably) 9)-->
+ <xsl:when test='name(.)="fo:font-size"'>
+ <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
+ </xsl:when>
+
+ <!-- Font - Color (PALM: but mostly only 2 available)
+ black (#000000)
+ gray (#808080)(rendered as dark gray)
+ silver (#C0C0C0)(rendered as light gray)
+ white (#FFFFFF)-->
+ <xsl:when test='name(.)="fo:color"'>
+ <xsl:choose>
+ <xsl:when test="contains(. , '#FFFFFF') or contains(. , '#ffffff') or contains(. , 'white') or contains(. , 'WHITE')">
+ <xsl:text>color:#FFFFFF, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>color:#000000, </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+
+ <!--*** TABLE ATTRIBUTES ***-->
+ <xsl:when test='name(.)="fo:font-size"'>
+ <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
+ </xsl:when>
+ <xsl:when test='name(.)="style:column-width"'>
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='name(.)="style:row-height"'>
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:height; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>:height; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='name(.)="style:width"'> <!--earlier fo:width-->
+ <xsl:choose>
+ <!-- changing the distance measure: inch to in -->
+ <xsl:when test="contains(., 'ch')">
+ <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+<!-- 2DO: NAMING CONVENTION variable are written with '-' instead of case-sensitive writing -->
+
+
+
+ <!-- ***** MEASUREMENT CONVERSIONS *****
+
+ * 1 centimeter = 10 mm
+
+ * 1 inch = 25.4 mm
+ While the English have already seen the light (read: the metric system), the US
+ remains loyal to this medieval system.
+
+ * 1 didot point = 0.376065 mm
+ The didot system originated in France but was used in most of Europe
+
+ * 1 pica point = 0.35146 mm
+ The Pica points system was developed in England and is used in Great-Britain and the US.
+
+ * 1 PostScript point = 0.35277138 mm
+ When Adobe created PostScript, they added their own system of points.
+ There are exactly 72 PostScript points in 1 inch.
+
+ * 1 pixel = 0.26458333.. mm (by 96 dpi)
+ Most pictures have the 96 dpi resolution, but the dpi variable may vary by stylesheet parameter
+ -->
+
+
+ <!-- changing measure to mm -->
+ <xsl:template name="convert2mm">
+ <xsl:param name="value"/>
+
+ <xsl:param name="centimeter-in-mm" select="10"/>
+ <xsl:param name="inch-in-mm" select="25.4"/>
+ <xsl:param name="didot-point-in-mm" select="0.376065"/>
+ <xsl:param name="pica-point-in-mm" select="0.35146"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, 'cm')">
+ <xsl:value-of select="round(number(substring-before($value,'cm' )) * $centimeter-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'in')">
+ <xsl:value-of select="round(number(substring-before($value,'in' )) * $inch-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'dpt')">
+ <xsl:value-of select="round(number(substring-before($value,'dpt')) * $didot-point-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'ppt')">
+ <xsl:value-of select="round(number(substring-before($value,'ppt')) * $pica-point-in-mm)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- changing measure to cm -->
+ <xsl:template name="convert2cm">
+ <xsl:param name="value"/>
+
+ <xsl:param name="centimeter-in-mm" select="10"/>
+ <xsl:param name="inch-in-mm" select="25.4"/>
+ <xsl:param name="didot-point-in-mm" select="0.376065"/>
+ <xsl:param name="pica-point-in-mm" select="0.35146"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, 'mm')">
+ <xsl:value-of select="round(number(substring-before($value, 'mm')) div $centimeter-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'in')">
+ <xsl:value-of select="round(number(substring-before($value, 'in')) div $centimeter-in-mm * $inch-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'dpt')">
+ <xsl:value-of select="round(number(substring-before($value,'dpt')) div $centimeter-in-mm * $didot-point-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'ppt')">
+ <xsl:value-of select="round(number(substring-before($value,'ppt')) div $centimeter-in-mm * $pica-point-in-mm)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- changing measure to inch (cp. section comment) -->
+ <xsl:template name="convert2inch">
+ <xsl:param name="value"/>
+
+ <xsl:param name="centimeter-in-mm" select="10"/>
+ <xsl:param name="inch-in-mm" select="25.4"/>
+ <xsl:param name="didot-point-in-mm" select="0.376065"/>
+ <xsl:param name="pica-point-in-mm" select="0.35146"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, 'mm')">
+ <xsl:value-of select="round(number(substring-before($value, 'mm')) div $inch-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'cm')">
+ <xsl:value-of select="round(number(substring-before($value, 'cm')) div $inch-in-mm * $centimeter-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'dpt')">
+ <xsl:value-of select="round(number(substring-before($value,'dpt')) div $inch-in-mm * $didot-point-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'ppt')">
+ <xsl:value-of select="round(number(substring-before($value,'ppt')) div $inch-in-mm * $pica-point-in-mm)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- changing measure to dpt (cp. section comment) -->
+ <xsl:template name="convert2dpt">
+ <xsl:param name="value"/>
+
+ <xsl:param name="centimeter-in-mm" select="10"/>
+ <xsl:param name="inch-in-mm" select="25.4"/>
+ <xsl:param name="didot-point-in-mm" select="0.376065"/>
+ <xsl:param name="pica-point-in-mm" select="0.35146"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, 'mm')">
+ <xsl:value-of select="round(number(substring-before($value, 'mm')) div $didot-point-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'cm')">
+ <xsl:value-of select="round(number(substring-before($value, 'cm')) div $didot-point-in-mm * $centimeter-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'in')">
+ <xsl:value-of select="round(number(substring-before($value, 'in')) div $didot-point-in-mm * $inch-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'ppt')">
+ <xsl:value-of select="round(number(substring-before($value,'ppt')) div $didot-point-in-mm * $pica-point-in-mm)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+ <!-- changing measure to ppt (cp. section comment) -->
+ <xsl:template name="convert2ppt">
+ <xsl:param name="value"/>
+
+ <xsl:param name="centimeter-in-mm" select="10"/>
+ <xsl:param name="inch-in-mm" select="25.4"/>
+ <xsl:param name="didot-point-in-mm" select="0.376065"/>
+ <xsl:param name="pica-point-in-mm" select="0.35146"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, 'mm')">
+ <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pica-point-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'cm')">
+ <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pica-point-in-mm * $centimeter-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'in')">
+ <xsl:value-of select="round(number(substring-before($value, 'in')) div $pica-point-in-mm * $inch-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'dpt')">
+ <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pica-point-in-mm * $didot-point-in-mm)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- changing measure to pixel by via parameter provided dpi (dots per inch) standard factor (cp. section comment) -->
+ <xsl:template name="convert2pixel">
+ <xsl:param name="value"/>
+
+ <xsl:param name="centimeter-in-mm" select="10"/>
+ <xsl:param name="inch-in-mm" select="25.4"/>
+ <xsl:param name="didot-point-in-mm" select="0.376065"/>
+ <xsl:param name="pica-point-in-mm" select="0.35146"/>
+ <xsl:param name="pixel-in-mm" select="$inch-in-mm div $dpi"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, 'mm')">
+ <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pixel-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'cm')">
+ <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pixel-in-mm * $centimeter-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'in')">
+ <xsl:value-of select="round(number(substring-before($value, 'in')) div $pixel-in-mm * $inch-in-mm)"/>
+ </xsl:when>
+ <xsl:when test="contains($value, 'dpt')">
+ <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pixel-in-mm * $didot-point-in-mm)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+ <!-- table row handling -->
+ <xsl:include href="table_rows.xsl"/>
+ <!-- table column handling -->
+ <xsl:include href="table_columns.xsl"/>
+ <!-- table cell handling -->
+ <xsl:include href="table_cells.xsl"/>
+
+
+
+ <!-- ******************* -->
+ <!-- *** main table *** -->
+ <!-- ******************* -->
+
+ <xsl:template match="table:table | table:sub-table">
+ <xsl:param name="collectedGlobalData"/>
+
+ <!-- a table will only be created if the "scenario" is active -->
+ <xsl:if test="string-length(table:scenario/@table:is-active) = 0">
+ <!-- collecting all visible "table:table-row" elements of the table -->
+ <xsl:variable name="allVisibleTableRows" select="table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
+ | table:table-header-rows/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
+ | table:table-row-group/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]"/>
+ <xsl:choose>
+ <!-- for all but WAP/WML devices a table border check is done (cp. "check-for-table-border") -->
+ <xsl:when test="not($outputType = 'WML')">
+
+ <!-- As the alignment of a table is by 'align' attribut is deprecated and as the CSS 'float' attribute not well displayed,
+ we do a little trick by encapsulating the table with a aligned 'div' element-->
+ <xsl:variable name="table-alignment" select="$office:automatic-styles/style:style[@style:name = current()/@table:style-name]/style:properties/@table:align"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($table-alignment) != 0">
+ <xsl:element name="div">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test='$table-alignment="left" or $table-alignment="margins"'>
+ <xsl:text>left</xsl:text>
+ </xsl:when>
+ <xsl:when test='$table-alignment="right"'>
+ <xsl:text>right</xsl:text>
+ </xsl:when>
+ <xsl:when test='$table-alignment="center"'>
+ <xsl:text>center</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:element name="table">
+
+ <xsl:apply-templates select="@table:style-name">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ <!-- workaround, set table border attribut if any cell-border exists
+ <xsl:call-template name="check-for-table-border">
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ </xsl:call-template> -->
+ <xsl:call-template name="create-column-style-variable">
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="table">
+ <xsl:apply-templates select="@table:style-name">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+
+ <!-- workaround, set table border attribut if any cell-border exists
+ <xsl:call-template name="check-for-table-border">
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ </xsl:call-template> -->
+ <xsl:call-template name="create-column-style-variable">
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- for WML devices only ASCII table are written as tables are not implemented widley.
+ Beginning from 'repeat-write-row' the templates are handled by the table_wml.xsl stylesheet -->
+ <xsl:call-template name="create-column-style-variable">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:template>
+
+
+
+ <xsl:template name="create-column-style-variable">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allVisibleTableRows"/>
+
+ <!-- all columns of the table -->
+ <xsl:variable name="allTableColumns" select="table:table-column |
+ table:table-column-group/descendant::table:table-column |
+ table:table-header-columns/descendant::table:table-column"/>
+ <!-- allColumnStyleEntries: Containing all columns of the table, hidden and viewed.
+ - if a column is hidden, it contains the hidden attribute, otherwise the style-properties will be stored
+ - if a column is being repeated, each repeated column is explicitly written as entry in this variable.
+ Later (during template "write-cell") the style of the column will be mixed with the cell-style by using
+ the position() of the column entry and comparing it with the iterating cell number. -->
+ <xsl:variable name="allColumnStyleEntries-RTF">
+ <xsl:call-template name="adding-column-styles-entries">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allTableColumns" select="$allTableColumns"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="create-table">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ <xsl:with-param name="allColumnStyleEntries" select="xt:node-set($allColumnStyleEntries-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="create-table">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+ <xsl:with-param name="allColumnStyleEntries" select="xalan:nodeset($allColumnStyleEntries-RTF)"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+
+
+ <xsl:template name="create-table">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allVisibleTableRows"/>
+ <xsl:param name="allColumnStyleEntries"/>
+
+
+ <!-- Some Office Calc documents simulate a background by repeating the last cell until end of space
+ (The value of "table:number-columns-repeated" is enourmous). Writing out all these cells would be fatal.
+ Therefore, this global variable shows us the longest row with content.
+
+ Earlier only the viewable columns were listed, but it is easier to handle with all columns:
+ <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry[not(@column-hidden-flag)])"/> -->
+ <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry)"/>
+
+
+ <!--isDebugMode-START-->
+ <xsl:if test="$isDebugMode">
+ <xsl:message>maxRowLength: <xsl:value-of select="$maxRowLength"/></xsl:message>
+ <xsl:variable name="numberOfHiddenColumns" select="count($allColumnStyleEntries/column-style-entry[@column-hidden-flag])"/>
+ <xsl:message>numberOfHiddenColumns: <xsl:value-of select="$numberOfHiddenColumns"/></xsl:message>
+ <xsl:call-template name="table-debug-allColumnStyleEntries">
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ </xsl:call-template>
+ </xsl:if>
+ <!--isDebugMode-END-->
+ <xsl:choose>
+ <xsl:when test="$outputType = 'WML'">
+ <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
+ (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
+ 2DO:CHECK WITH XALAN-->
+ <xsl:for-each select="$allVisibleTableRows">
+ <xsl:call-template name="wml-repeat-write-row">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="number-rows-repeated" select="@table:number-rows-repeated"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
+ (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
+ 2DO:CHECK WITH XALAN -->
+ <xsl:for-each select="$allVisibleTableRows">
+ <xsl:call-template name="repeat-write-row">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="number-rows-repeated" select="@table:number-rows-repeated"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+
+
+ <!-- **************************** -->
+ <!-- *** HELPER: table border *** -->
+ <!-- **************************** -->
+
+ <!-- only one table border for HTML4 or CSS devices which contain one or more 'fo:border-top' attributes (pars pro toto, if one exist the other usually exist, too) -->
+ <!-- this was a work-around for the netscape 4.xx but not longer necessary for Mozilla -->
+ <xsl:template name="check-for-table-border">
+ <xsl:param name="allVisibleTableRows"/>
+
+ <xsl:variable name="startTime">
+ <xsl:if test="$isDebugMode and not($isJavaDisabled)">
+ <xsl:choose>
+ <xsl:when test="function-available('system:current-time-millis')">
+ <xsl:value-of select="system:current-time-millis()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
+ <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <!-- checks if one cell (table:table-cell) of the rows of this table (allVisibleTableRows) contains a border style (i.e. fo:border-top)
+ If only one single border element exist, the whole table will gets pre-defined borders (simple heuristic for better browser display) -->
+ <xsl:if test="$allVisibleTableRows/table:table-cell[@table:style-name=/*/*/style:style[style:properties/@fo:border-top]/@style:name]">
+ <xsl:attribute name="border">1</xsl:attribute>
+ <xsl:attribute name="bordercolor">#000000</xsl:attribute>
+ <xsl:attribute name="cellpadding">2</xsl:attribute>
+ <xsl:attribute name="cellspacing">0</xsl:attribute>
+ <xsl:attribute name="page-break-inside">page-break-inside:avoid</xsl:attribute>
+ </xsl:if>
+
+
+ <!-- check the time for borderchecking (debug)-->
+ <xsl:if test="$isDebugMode and not($isJavaDisabled)">
+ <xsl:variable name="endTime">
+ <xsl:choose>
+ <xsl:when test="function-available('system:current-time-millis')">
+ <xsl:value-of select="system:current-time-millis()"/>
+ </xsl:when>
+ <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
+ <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:message>Time for checking BorderStyle: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+ <!-- *********************************** -->
+ <!-- *** write repeating table cells *** -->
+ <!-- *********************************** -->
+
+
+ <!-- matching cells to give out -> covered table cells are not written out -->
+ <xsl:template match="table:table-cell">
+ <xsl:param name="collectedGlobalData"/>
+ <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="maxRowLength"/>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>
+--------------> table:table-cell has been entered with node value: <xsl:value-of select="."/></xsl:message>
+ <xsl:message>table:number-columns-repeated: -<xsl:value-of select="@table:number-columns-repeated"/>-</xsl:message>
+ </xsl:if>
+
+ <xsl:call-template name="create-column-position-variable">
+ <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+
+ </xsl:template>
+
+
+
+ <xsl:template name="create-column-position-variable">
+ <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="maxRowLength"/>
+
+ <!-- column position needed for styles, esp. for column-hidden-flag -->
+ <xsl:variable name="preceding-columns">
+ <xsl:for-each select="preceding-sibling::*">
+ <xsl:element name="quantity">
+ <xsl:choose>
+ <xsl:when test="string-length(@table:number-columns-repeated) = 0">1</xsl:when>
+ <xsl:otherwise><xsl:value-of select="@table:number-columns-repeated"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('xt:node-set')">
+ <xsl:call-template name="create-table-cell">
+ <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ <xsl:with-param name="column-position" select="sum(xt:node-set($preceding-columns)/quantity) + 1"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="function-available('xalan:nodeset')">
+ <xsl:call-template name="create-table-cell">
+ <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ <xsl:with-param name="column-position" select="sum(xalan:nodeset($preceding-columns)/quantity) + 1"/>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="NodeSetFunctionNotAvailable"/>
+ <xsl:call-template name="create-table-cell"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="create-table-cell">
+ <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="maxRowLength"/>
+ <xsl:param name="column-position"/>
+
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>NEW VALUE: column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
+ </xsl:if>
+
+
+ <!-- a hidden column will give out nothing -->
+ <xsl:if test="not($allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag)">
+ <xsl:choose>
+ <!-- when the columns are not repeated the next column-positions raises up to 1, otherwise up to the amount of repeated columns -->
+ <xsl:when test="@table:number-columns-repeated">
+ <!-- writes multiple entries of a cell -->
+ <xsl:call-template name="repeat-write-cell">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="column-position" select="$column-position"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ <xsl:with-param name="number-columns-repeated" select="@table:number-columns-repeated"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- writes an entry of a cell -->
+ <xsl:call-template name="write-cell">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="column-position" select="$column-position"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ </xsl:template>
+
+
+
+ <xsl:template name="repeat-write-cell">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="column-position"/>
+ <xsl:param name="maxRowLength"/>
+ <xsl:param name="number-columns-repeated"/>
+
+ <xsl:choose>
+ <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
+ <xsl:when test="$number-columns-repeated > 1 and $maxRowLength > $column-position">
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>+++++++++ starting cell writing +++++++++</xsl:message>
+ <xsl:message>number-columns-repeated: -<xsl:value-of select="$number-columns-repeated"/>-</xsl:message>
+ <xsl:message>maxRowLength: -<xsl:value-of select="$maxRowLength"/>-</xsl:message>
+ <xsl:message>column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
+ </xsl:if>
+
+ <!-- writes an entry of a cell -->
+ <xsl:call-template name="write-cell">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="column-position" select="$column-position"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+ <!-- repeat calling this method until all elements written out -->
+ <xsl:if test="$isDebugMode">
+ <xsl:message>+++++++++ cell repetition +++++++++</xsl:message>
+ </xsl:if>
+ <xsl:call-template name="repeat-write-cell">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="column-position" select="$column-position + 1"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ <xsl:with-param name="number-columns-repeated" select="$number-columns-repeated - 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
+ <!-- When the maxRowLength is reached a last entry of a cell is written -->
+ <xsl:call-template name="write-cell">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="column-position" select="$column-position"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="write-cell">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="column-position"/>
+ <xsl:param name="maxRowLength"/>
+
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>WriteTest -> If nothing between '-' write cell -<xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag"/>-</xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
+ <xsl:if test="$isDebugMode">
+ <xsl:message>TABLE COLUMN is hidden!</xsl:message>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:choose>
+ <!-- a hidden column will give out nothing -->
+ <xsl:when test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
+ <xsl:if test="$isDebugMode">
+ <xsl:message>TABLE COLUMN is hidden!</xsl:message>
+ </xsl:if>
+ </xsl:when>
+
+ <!-- NOT a hidden column -->
+ <xsl:otherwise>
+
+ <!-- a table is a table header, when it has a "table:table-header-rows" ancestor -->
+ <xsl:variable name="tableDataType">
+ <xsl:choose>
+ <xsl:when test="ancestor::table:table-header-rows">
+ <xsl:text>th</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>td</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:element name="{$tableDataType}">
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>
+*****************************************'<xsl:value-of select="$tableDataType"/>' element has been added!</xsl:message>
+ </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>
+
+
+
+ <!-- *** the cell-style *** -->
+ <!-- The cell style has no conclusion with the column style, so we switch the order/priorities due to browser issues
+
+ The cell-style depends on two attributes:
+
+ 1) table:style-name - the style properties of cell. When they exist, a default alignement (cp. below) will be added for the
+ case of no alignment in the style exist.
+
+ 2) table:value-type - the value type of the table-cell giving the default alignments.
+ By default a string value is left aligned, all other are aligned:right.
+ -->
+ <xsl:choose>
+ <xsl:when test="@table:style-name">
+ <xsl:attribute name="style">
+
+ <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
+ <xsl:variable name="cellStyle" select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
+ <xsl:choose>
+ <xsl:when test="string-length($cellStyle) > 0 and not(contains($cellStyle, 'text-align'))">
+ <!-- CELL-STYLE: alignment by table:value-type -->
+ <!-- no alignment in the cell style, the alignment based on the table:value-type will be added -->
+ <xsl:choose>
+ <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
+ <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:right; ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:left; ')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- CELL-STYLE: alignment by table:value-type -->
+ <!-- no CSS style properties exist, only alignment from the table:value-type will be used -->
+ <xsl:choose>
+ <xsl:when test="@table:value-type and not(@table:value-type = 'string')">text-align:right; </xsl:when>
+ <xsl:otherwise>text-align:left; </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- column-style (disjunct of cell style -->
+ <!-- 2DO: only absolut styles are supported, relative styles (i.e. 'style:rel-column-width' e.g. with value "8933*" are ignored.
+ Issue: browsers (not sure if CSS) does not support the '*' relationship, only the '%', where the sum is always '100'!
+ For this, it is easier to work on with the absolute values, instead of calculating the values for 100% -->
+ <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
+ </xsl:attribute>
+ <!-- CELL-STYLE: table:style-name -->
+ <xsl:attribute name="class">
+ <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">
+ <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
+ <!-- no table:style-name exist, only alignment from the table:value-type will be used -->
+ <xsl:choose>
+ <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
+ text-align:right;
+ </xsl:when>
+ <xsl:otherwise>
+ text-align:left;
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <!-- In case of no cell content a non-breakable space will be inserted
+ to make the browser show the table-cell grid -->
+ <xsl:when test="not(child::text()) and not(child::*)">
+ <xsl:text>  </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- *** the column-style *** -->
+ <!-- the column style has no conclusion with the cell style, so we switch the order/priorities due to browser issues-->
+ <xsl:element name="span">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@style-name"/>
+ </xsl:attribute>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:element name="{$tableDataType}">
+
+ <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:attribute name="style">
+ <!-- cell-style -->
+ <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
+ <!-- column-style -->
+ <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
+ <!-- TABLE:VALUE-TYPE - the value of a table-cell will be aligned left by default only exlicit non-string is aligned:right-->
+ <xsl:choose>
+ <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
+ <xsl:text>text-align:right;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>text-align:left;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <!--   is a non-breakable space, necessary to make to the browser show the table-cell grid -->
+ <xsl:if test="not(child::text()) and not(child::*)">  </xsl:if>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ PALM INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'PALM'">
+ <xsl:element name="{$tableDataType}">
+ <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>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+ <!--+++++ WML WAY +++++-->
+ <xsl:when test="$outputType = 'WML'">
+ <xsl:choose>
+ <xsl:when test="not($allColumnStyleEntries/column-style-entry[last() = $column-position])">
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:apply-templates>
+ <xsl:text>; </xsl:text>
+ <xsl:element name="br"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+ <!-- ******************************************** -->
+ <!-- *** Create table columns style variable *** -->
+ <!-- ******************************************** -->
+
+ <xsl:template name="adding-column-styles-entries">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allTableColumns"/>
+
+ <xsl:for-each select="$allTableColumns">
+
+ <xsl:variable name="column-style-entry" select="$collectedGlobalData/allstyles/*[name() = translate(current()/@table:style-name, '. %()/\', '')]"/>
+ <xsl:choose>
+ <xsl:when test="not(@table:number-columns-repeated)">
+ <!-- writes an entry of a column in the columns-variable -->
+ <xsl:call-template name="adding-column-style-entry">
+ <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- No higher repetition of cells greater than 4 for the last and second last column -->
+ <!-- a hack for the sample document 'Waehrungsumrechner.sxc having 230 repeated columns in the second last column -->
+ <!-- ??? <xsl:when test="(position() = last() or (position() = (last() - 1)) and @table:number-columns-repeated < 5)"> ???-->
+ <xsl:when test="position() = last() or position() = (last() - 1)">
+ <xsl:if test="@table:number-columns-repeated < 5">
+ <!-- writes an entry of a column in the columns-variable -->
+ <xsl:call-template name="repeat-adding-column-style-entry">
+ <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+ <xsl:with-param name="number-columns-repeated" select="1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- repeated colums will be written explicit several times in the variable-->
+ <xsl:call-template name="repeat-adding-column-style-entry">
+ <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+ <xsl:with-param name="number-columns-repeated" select="@table:number-columns-repeated"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:template>
+
+
+ <!-- WRITES THE REPEATED COLUMN STYLE EXPLICIT AS AN ELEMENT IN THE COLUMNS-VARIABLE -->
+ <xsl:template name="repeat-adding-column-style-entry">
+ <xsl:param name="column-style-entry"/>
+ <xsl:param name="number-columns-repeated"/>
+
+ <xsl:choose>
+ <xsl:when test="$number-columns-repeated > 1">
+ <!-- writes an entry of a column in the columns-variable -->
+ <xsl:call-template name="adding-column-style-entry">
+ <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+ </xsl:call-template>
+ <!-- repeat calling this method until all elements written out -->
+ <xsl:call-template name="repeat-adding-column-style-entry">
+ <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+ <xsl:with-param name="number-columns-repeated" select="$number-columns-repeated - 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- writes an entry of a column in the columns-variable -->
+ <xsl:call-template name="adding-column-style-entry">
+ <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <!-- THE COLUMN-STYLE WRITE-PATTERN FOR EACH COLUMN WRITTEN IN A VARIABLE -->
+ <xsl:template name="adding-column-style-entry">
+ <xsl:param name="column-style-entry"/>
+
+ <xsl:element name="column-style-entry">
+ <xsl:choose>
+ <xsl:when test="@table:visibility = 'collapse' or @table:visibility = 'filter'">
+ <xsl:attribute name="column-hidden-flag">true</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="table:style-name" select="translate(@table:style-name, '. %()/\', '')"/>
+ <xsl:attribute name="style-name"><xsl:value-of select="$table:style-name"/></xsl:attribute>
+ <xsl:value-of select="$column-style-entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:template>
+
+
+
+ <!--isDebugMode-START-->
+ <!-- giving out the 'allColumnStyle' variable:
+ For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
+ In case of 'column-hidden-flag' attribute the text 'Column is hidden is given out.-->
+ <xsl:template name="table-debug-allColumnStyleEntries">
+ <xsl:param name="allColumnStyleEntries"/>
+
+ <!-- debug output as table summary attribut in html -->
+ <xsl:attribute name="summary">
+ <xsl:call-template name="table-debug-column-out">
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <!-- debug output to console -->
+ <xsl:message>
+ <xsl:call-template name="table-debug-column-out">
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ </xsl:call-template>
+ </xsl:message>
+ </xsl:template>
+
+
+ <xsl:template name="table-debug-column-out">
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:text>
+ DebugInformation: For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
+ In case of 'column-hidden-flag' attribute the text 'column is hidden' is given out.
+ </xsl:text>
+ <xsl:for-each select="$allColumnStyleEntries/column-style-entry">
+ <xsl:choose>
+ <xsl:when test="@column-hidden-flag">
+ <xsl:text> </xsl:text><xsl:value-of select="@style-name"/><xsl:text>column is hidden</xsl:text><xsl:text>
+ </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text><xsl:value-of select="@style-name"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
+ </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:template>
+ <!--isDebugMode-END-->
+
+</xsl:stylesheet>
--- /dev/null
+<!--
+
+ The Contents of this file are made available subject to the terms of
+ either of the following licenses
+
+ - GNU Lesser General Public License Version 2.1
+ - Sun Industry Standards Source License Version 1.1
+
+ Sun Microsystems Inc., October, 2000
+
+ GNU Lesser General Public License Version 2.1
+ =============================================
+ Copyright 2000 by Sun Microsystems, Inc.
+ 901 San Antonio Road, Palo Alto, CA 94303, USA
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License version 2.1, as published by the Free Software Foundation.
+
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
+
+
+ Sun Industry Standards Source License Version 1.1
+ =================================================
+ The contents of this file are subject to the Sun Industry Standards
+ Source License Version 1.1 (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.openoffice.org/license.html.
+
+ Software provided under this License is provided on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ See the License for the specific provisions governing your rights and
+ obligations concerning the Software.
+
+ The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+ Copyright © 2002 by Sun Microsystems, Inc.
+
+ All Rights Reserved.
+
+ Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="http://openoffice.org/2000/office"
+ xmlns:style="http://openoffice.org/2000/style"
+ xmlns:text="http://openoffice.org/2000/text"
+ xmlns:table="http://openoffice.org/2000/table"
+ xmlns:draw="http://openoffice.org/2000/drawing"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:number="http://openoffice.org/2000/datastyle"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="http://openoffice.org/2000/chart"
+ xmlns:dr3d="http://openoffice.org/2000/dr3d"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="http://openoffice.org/2000/form"
+ xmlns:script="http://openoffice.org/2000/script"
+ office:class="text"
+ office:version="1.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="http://openoffice.org/2000/meta"
+ xmlns:config="http://openoffice.org/2001/config"
+ xmlns:help="http://openoffice.org/2000/help"
+ xmlns:xt="http://www.jclark.com/xt"
+ xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:java="http://xml.apache.org/xslt/java"
+ exclude-result-prefixes="java">
+
+
+
+ <!-- ********************************************* -->
+ <!-- *** write (explicit) repeating table rows *** -->
+ <!-- ********************************************* -->
+
+ <xsl:template name="repeat-write-row">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="number-rows-repeated" select="1"/>
+ <xsl:param name="maxRowLength"/>
+
+ <xsl:choose>
+ <!-- write an entry of a row and repeat calling this method until all elements are written out -->
+ <xsl:when test="$number-rows-repeated > 1 and (table:table-cell/text() or table:table-cell/*)">
+ <xsl:call-template name="write-row">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+
+ <!-- 2DO: take variable from the output of repeated write-row and iterate giving out the variable -->
+ <xsl:call-template name="repeat-write-row">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ <xsl:with-param name="number-rows-repeated" select="$number-rows-repeated - 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- write a single entry of a row -->
+ <xsl:otherwise>
+ <xsl:call-template name="write-row">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+
+ <xsl:template name="write-row">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="maxRowLength"/>
+
+
+ <xsl:element name="tr">
+ <!-- writing the style of the row -->
+ <xsl:call-template name='add-style-properties'>
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ </xsl:call-template>
+
+ <xsl:if test="$isDebugMode">
+ <xsl:message>
+*************************'tr' element has been added!</xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="table:table-cell">
+ <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+ <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+ <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
+ </xsl:apply-templates>
+
+ </xsl:element>
+ </xsl:template>
+
+
+ <!-- **************************** -->
+ <!-- *** HELPER: table styles *** -->
+ <!-- **************************** -->
+
+ <xsl:template name="add-style-properties">
+ <xsl:param name="collectedGlobalData"/>
+ <xsl:param name="allColumnStyleEntries"/>
+ <xsl:param name="node-position"/>
+
+ <xsl:choose>
+ <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_HEADER'">
+ <xsl:attribute name="class">
+ <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!--+++++ HTML 4.0 INLINED WAY +++++-->
+ <xsl:when test="$outputType = 'CSS_INLINED'">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Pdf class simply outputs the PDF file with the
+ * content-type 'application/pdf' enabling web browsers with a PDF viewer
+ * plugin to view the PDF file inside the browser.
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Pdf extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_mimepart->getContents(),
+ 'status' => array(),
+ 'type' => 'application/pdf'
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Php class renders out syntax-highlighted PHP code in
+ * HTML format.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Php extends Horde_Mime_Viewer_source
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+
+ // Need Horde headers for CSS tags.
+ reset($ret);
+ $ret[key($ret)]['data'] = Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+ $ret[key($ret)]['data'] .
+ Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ ini_set('highlight.comment', 'comment');
+ ini_set('highlight.default', 'default');
+ ini_set('highlight.keyword', 'keyword');
+ ini_set('highlight.string', 'string');
+ ini_set('highlight.html', 'html');
+
+ $code = $this->_mimepart->getContents();
+ $text = (strpos($code, '<?php') === false)
+ ? $this->_lineNumber(str_replace('<?php ', '', highlight_string('<?php ' . $code, true)))
+ : $this->_lineNumber(highlight_string($code, true));
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $text,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Add line numbers to a block of code.
+ *
+ * @param string $code The code to number.
+ *
+ * @return string The code with line numbers added.
+ */
+ protected function _lineNumber($code, $linebreak = "\n")
+ {
+ // Clean up.
+ $code = preg_replace(
+ array(
+ '/<code><span style="color: #?\w+">\s*/',
+ '/<code><font color="#?\w+">\s*/',
+ '/\s*<\/span>\s*<\/span>\s*<\/code>/',
+ '/\s*<\/font>\s*<\/font>\s*<\/code>/'
+ ), '', $code);
+
+ $code = str_replace(
+ array(' ', '&', '<br />', '<span style="color: ', '<font color="', '</font>',),
+ array(' ', '&', "\n", '<span class="', '<span class="', '</span>',),
+ $code);
+
+ $code = trim($code);
+
+ // Normalize newlines.
+ $code = str_replace("\r", '', $code);
+ $code = preg_replace('/\n\n\n+/', "\n\n", $code);
+
+ $results = array('<ol class="code-listing striped">');
+ $previous = false;
+
+ $lines = explode("\n", $code);
+ reset($lines);
+ while (list($lineno, $line) = each($lines)) {
+ if (substr($line, 0, 7) == '</span>') {
+ $previous = false;
+ $line = substr($line, 7);
+ }
+
+ if (empty($line)) {
+ $line = ' ';
+ }
+
+ if ($previous) {
+ $line = "<span class=\"$previous\">" . $line;
+ }
+
+ // Save the previous style.
+ if (strpos($line, '<span') !== false) {
+ switch (substr($line, strrpos($line, '<span') + 13, 1)) {
+ case 'c':
+ $previous = 'comment';
+ break;
+
+ case 'd':
+ $previous = 'default';
+ break;
+
+ case 'k':
+ $previous = 'keyword';
+ break;
+
+ case 's':
+ $previous = 'string';
+ break;
+ }
+ }
+
+ // Unset previous style unless the span continues.
+ if (substr($line, -7) == '</span>') {
+ $previous = false;
+ } elseif ($previous) {
+ $line .= '</span>';
+ }
+
+ $results[] = '<li id="l' . ($lineno + 1). '">' . $line . '</li>';
+ }
+
+ $results[] = '</ol>';
+
+ return implode("\n", $results);
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Plain class renders out plain text with URLs made
+ * into hyperlinks (if viewing inline).
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Plain extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $text = $this->_mimepart->getContents();
+ $charset = $this->_mimepart->getCharset();
+
+ /* Check for 'flowed' text data. */
+ if ($this->_mimepart->getContentTypeParameter('format') == 'flowed') {
+ $text = $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'));
+ }
+
+ require_once 'Horde/Text/Filter.php';
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => '<html><body><tt>' . Text_Filter::filter($text, 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'charset' => $charset, 'class' => null)) . '</tt></body></html>',
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . $charset
+ )
+ );
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ $text = String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset());
+
+ /* Check for 'flowed' text data. */
+ $data = ($this->_mimepart->getContentTypeParameter('format') == 'flowed')
+ ? $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'))
+ : $text;
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $data,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Format flowed text for HTML output.
+ *
+ * @param string $text The text to format.
+ * @param boolean $delsp Was text created with DelSp formatting?
+ *
+ * @return string The formatted text.
+ */
+ protected function _formatFlowed($text, $delsp = null)
+ {
+ $flowed = new Horde_Text_Flowed($this->_mimepart->replaceEOL($text, "\n"), $this->_mimepart->getCharset());
+ $flowed->setMaxLength(0);
+ if (!is_null($delsp)) {
+ $flowed->setDelSp($delsp);
+ }
+ return $flowed->toFixed();
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Rar class renders out the contents of .rar archives
+ * in HTML format.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Michael Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rar extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+ if (!empty($ret)) {
+ reset($ret);
+ $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+ }
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ $contents = $this->_mimepart->getContents();
+
+ $rar = &Horde_Compress::singleton('rar');
+
+ $rarData = $rar->decompress($contents);
+ if (is_a($rarData, 'PEAR_Error')) {
+ return array();
+ }
+ $fileCount = count($rarData);
+
+ require_once 'Horde/Text.php';
+
+ $name = $this->_mimepart->getName(true);
+ if (empty($name)) {
+ $name = _("unnamed");
+ }
+
+ $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
+ '<table><tr><td align="left"><tt><span class="fixed">' .
+ Text::htmlAllSpaces(_("Archive Name") . ': ' . $name) . "\n" .
+ Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
+ Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
+ "\n\n" .
+ Text::htmlAllSpaces(
+ String::pad(_("File Name"), 50, ' ', STR_PAD_RIGHT) .
+ String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
+ String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT)
+ ) . "\n" .
+ str_repeat('-', 109) . "\n";
+
+ foreach ($rarData as $val) {
+ $ratio = empty($val['size'])
+ ? 0
+ : 100 * ($val['csize'] / $val['size']);
+
+ $text .= Text::htmlAllSpaces(
+ String::pad($val['name'], 50, ' ', STR_PAD_RIGHT) .
+ String::pad($val['attr'], 10, ' ', STR_PAD_LEFT) .
+ String::pad($val['size'], 10, ' ', STR_PAD_LEFT) .
+ String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT) .
+ String::pad($val['method'], 10, ' ', STR_PAD_LEFT) .
+ String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT)
+ ) . "\n";
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Report class is a wrapper used to load the
+ * appropriate Horde_Mime_Viewer for multipart/report data (RFC 3462).
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Report extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Return the underlying MIME Viewer for this part.
+ *
+ * @return mixed A Horde_Mime_Viewer object, or false if not found.
+ */
+ protected function _getViewer()
+ {
+ if (!($type = $this->_mimepart->getContentTypeParameter('report-type'))) {
+ return false;
+ }
+
+ $viewer = Horde_Mime_Viewer::factory($this->_mimepart, 'message/' . String::lower($type));
+ if ($viewer) {
+ $viewer->setParams($this->_params);
+ }
+ return $viewer;
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Rfc822 class renders out messages from the
+ * message/rfc822 content type.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rfc822 extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => true,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_mimepart->getContents(),
+ 'status' => array(),
+ 'type' => 'text/plain; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Return the rendered information about the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInfo()
+ {
+ /* Get the text of the part. Since we need to look for the end of
+ * the headers by searching for the CRLFCRLF sequence, use
+ * getCanonicalContents() to make sure we are getting the text with
+ * CRLF's. */
+ $text = $this->_mimepart->getCanonicalContents();
+ if (empty($text)) {
+ return array();
+ }
+
+ /* Search for the end of the header text (CRLFCRLF). */
+ $text = substr($text, 0, strpos($text, "\r\n\r\n"));
+
+ /* Get the list of headers now. */
+ $headers = Horde_Mime_Headers::parseHeaders($text);
+
+ $header_array = array(
+ 'date' => _("Date"),
+ 'from' => _("From"),
+ 'to' => _("To"),
+ 'cc' => _("Cc"),
+ 'bcc' => _("Bcc"),
+ 'reply-to' => _("Reply-To"),
+ 'subject' => _("Subject")
+ );
+ $header_output = array();
+
+ foreach ($header_array as $key => $val) {
+ $hdr = $headers->getValue($key);
+ if (!empty($hdr)) {
+ $header_output[] = '<strong>' . $val . ':</strong> ' . htmlspecialchars($hdr);
+ }
+ }
+
+ require_once 'Horde/Text/Filter.php';
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => empty($header_output) ? '' : ('<div class="mimeHeaders">' . Text_Filter::filter(implode("<br />\n", $header_output), 'emails') . '</div>'),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Richtext class renders out HTML text from
+ * text/richtext content tags, (RFC 1896 [7.1.3]).
+ *
+ * A minimal richtext implementation is one that simply converts "<lt>" to
+ * "<", converts CRLFs to SPACE, converts <nl> to a newline according to
+ * local newline convention, removes everything between a <comment> command
+ * and the next balancing </comment> command, and removes all other
+ * formatting commands (all text enclosed in angle brackets).
+ *
+ * We implement the following tags:
+ * <bold>, <italic>, <fixed>, <smaller>, <bigger>, <underline>, <center>,
+ * <flushleft>, <flushright>, <indent>, <subscript>, <excerpt>, <paragraph>,
+ * <signature>, <comment>, <no-op>, <lt>, <nl>
+ *
+ * The following tags are implemented differently than described in the RFC
+ * (due to limitations in HTML output):
+ * <heading> - Output as centered, bold text.
+ * <footing> - Output as centered, bold text.
+ * <np> - Output as paragraph break.
+ *
+ * The following tags are NOT implemented:
+ * <indentright>, <outdent>, <outdentright>, <samepage>, <iso-8859-X>,
+ * <us-ascii>,
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Richtext extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_toHTML(),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
+ )
+ );
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Convert richtext to HTML.
+ *
+ * @return string The converted HTML string.
+ */
+ protected function _toHTML()
+ {
+ $text = trim($this->_mimepart->getContents());
+ if ($text == '') {
+ return array();
+ }
+
+ /* We add space at the beginning and end of the string as it will
+ * make some regular expression checks later much easier (so we
+ * don't have to worry about start/end of line characters). */
+ $text = ' ' . $text . ' ';
+
+ /* Remove everything between <comment> tags. */
+ $text = preg_replace('/<comment.*>.*<\/comment>/Uis', '', $text);
+
+ /* Remove any unrecognized tags in the text. We don't need <no-op>
+ * in $tags since it doesn't do anything anyway. All <comment> tags
+ * have already been removed. */
+ $tags = '<bold><italic><fixed><smaller><bigger><underline><center><flushleft><flushright><indent><subscript><excerpt><paragraph><signature><lt><nl>';
+ $text = strip_tags($text, $tags);
+
+ /* <lt> becomes a '<'. CRLF becomes a SPACE. */
+ $text = str_ireplace(array('<lt>', "\r\n"), array('<', ' '), $text);
+
+ /* We try to protect against bad stuff here. */
+ $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
+
+ /* <nl> becomes a newline (<br />);
+ * <np> becomes a paragraph break (<p />). */
+ $text = str_ireplace(array('<nl>', '<np>'), array('<br />', '<p />'), $text);
+
+ /* Now convert the known tags to html. Try to remove any tag
+ * parameters to stop people from trying to pull a fast one. */
+ $replace = array(
+ '/(?<!<)<bold.*>(.*)<\/bold>/Uis' => '<span style="font-weight: bold">\1</span>',
+ '/(?<!<)<italic.*>(.*)<\/italic>/Uis' => '<span style="font-style: italic">\1</span>',
+ '/(?<!<)<fixed.*>(.*)<\/fixed>/Uis' => '<font face="fixed">\1</font>',
+ '/(?<!<)<smaller.*>(.*)<\/smaller>/Uis' => '<span style="font-size: smaller">\1</span>',
+ '/(?<!<)<bigger.*>(.*)<\/bigger>/Uis' => '<span style="font-size: larger">\1</span>',
+ '/(?<!<)<underline.*>(.*)<\/underline>/Uis' => '<span style="text-decoration: underline">\1</span>',
+ '/(?<!<)<center.*>(.*)<\/center>/Uis' => '<div align="center">\1</div>',
+ '/(?<!<)<flushleft.*>(.*)<\/flushleft>/Uis' => '<div align="left">\1</div>',
+ '/(?<!<)<flushright.*>(.*)<\/flushright>/Uis' => '<div align="right">\1</div>',
+ '/(?<!<)<indent.*>(.*)<\/indent>/Uis' => '<blockquote>\1</blockquote>',
+ '/(?<!<)<excerpt.*>(.*)<\/excerpt>/Uis' => '<cite>\1</cite>',
+ '/(?<!<)<subscript.*>(.*)<\/subscript>/Uis' => '<sub>\1</sub>',
+ '/(?<!<)<superscript.*>(.*)<\/superscript>/Uis' => '<sup>\1</sup>',
+ '/(?<!<)<heading.*>(.*)<\/heading>/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
+ '/(?<!<)<footing.*>(.*)<\/footing>/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
+ '/(?<!<)<paragraph.*>(.*)<\/paragraph>/Uis' => '<p>\1</p>',
+ '/(?<!<)<signature.*>(.*)<\/signature>/Uis' => '<address>\1</address>'
+ );
+ $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+ /* Now we remove the leading/trailing space we added at the start. */
+ $text = substr($text, 1, -1);
+
+ /* Wordwrap. */
+ $text = str_replace(array("\t", ' ', "\n "), array(' ', ' ', "\n "), $text);
+ if ($text[0] == ' ') {
+ $text = ' ' . substr($text, 1);
+ }
+
+ return '<p style="font-size:100%;font-family:Lucida Console,Courier,Courier New;">' . nl2br($text) . '</p>';
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Rpm class renders out lists of files in RPM
+ * packages by using the rpm tool to query the package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rpm extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $data = '';
+ $tmp_rpm = Horde::getTempFile('horde_rpm');
+
+ file_put_contents($tmp_rpm, $this->_mimepart->getContents());
+
+ $fh = popen($this->_conf['location'] . " -qip $tmp_rpm 2>&1", 'r');
+ while (($rc = fgets($fh, 8192))) {
+ $data .= $rc;
+ }
+ pclose($fh);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => '<html><body><pre>' . htmlentities($data) . '</pre></body></html>',
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Rtf class renders out Rich Text Format documents in
+ * HTML format by using the UnRTF package.
+ *
+ * UnRTF package: http://www.gnu.org/software/unrtf/unrtf.html
+ *
+ * Copyright 2007 Duck <duck@obala.net>
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Duck <duck@obala.net>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rtf extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $tmp_rtf = Horde::getTempFile('rtf');
+ $tmp_output = Horde::getTempFile('rtf');
+
+ file_put_contents($tmp_rtf, $this->_mimepart->getContents());
+
+ exec($this->_conf['location'] . " $tmp_rtf > $tmp_output");
+
+ if (file_exists($tmp_output)) {
+ $data = file_get_contents($tmp_output);
+ } else {
+ $data = _("Unable to translate this RTF document");
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $data,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Security class is a wrapper used to load the
+ * appropriate Horde_Mime_Viewer for secure multipart messages (defined by RFC
+ * 1847). This class handles multipart/signed and multipart/encrypted data.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Security extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Return the underlying MIME Viewer for this part.
+ *
+ * @return mixed A Horde_Mime_Viewer object, or false if not found.
+ */
+ protected function _getViewer()
+ {
+ if (!($protocol = $this->_mimepart->getContentTypeParameter('protocol'))) {
+ return false;
+ }
+
+ $viewer = Horde_Mime_Viewer::factory($this->_mimepart, $protocol);
+ if ($viewer) {
+ $viewer->setParams($this->_params);
+ }
+ return $viewer;
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Simple class renders out plain text without any
+ * modifications.
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Simple extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_mimepart->getContents(),
+ 'status' => array(),
+ 'type' => 'text/plain; charset=' . $this->_mimepart->getCharset()
+ )
+ );
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset()),
+ 'status' => array(),
+ 'type' => 'text/plain; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Smil renders SMIL documents to very basic HTML.
+ *
+ * Copyright 2006-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Jan Schneider <jan@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Smil extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Handle for the XML parser object.
+ *
+ * @var resource
+ */
+ protected $_parser;
+
+ /**
+ * String buffer to hold the generated content
+ *
+ * @var string
+ */
+ protected $_content;
+
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $this->_content = '';
+
+ /* Create a new parser and set its default properties. */
+ $this->_parser = xml_parser_create();
+ xml_set_object($this->_parser, $this);
+ xml_set_element_handler($this->_parser, '_startElement', '_endElement');
+ xml_set_character_data_handler($this->_parser, '_defaultHandler');
+ xml_parse($this->_parser, $this->_mimepart->getContents(), true);
+ xml_parser_free($this->_parser);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_content,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * User-defined function callback for start elements.
+ *
+ * @param object $parser Handle to the parser instance.
+ * @param string $name The name of this XML element.
+ * @param array $attrs List of this element's attributes.
+ */
+ protected function _startElement($parser, $name, $attrs)
+ {
+ switch ($name) {
+ case 'IMG':
+ if (isset($attrs['SRC'])) {
+ $this->_content .= '<img src="' . htmlspecialchars($attrs['SRC']) . '" />';
+ }
+ break;
+ }
+ }
+
+ /**
+ * User-defined function callback for end elements.
+ *
+ * @param object $parser Handle to the parser instance.
+ * @param string $name The name of this XML element.
+ */
+ protected function _endElement($parser, $name)
+ {
+ }
+
+ /**
+ * User-defined function callback for character data.
+ *
+ * @param object $parser Handle to the parser instance.
+ * @param string $data String of character data.
+ */
+ protected function _defaultHandler($parser, $data)
+ {
+ $data = trim($data);
+ if (!empty($data)) {
+ $this->_content .= ' ' . htmlspecialchars($data);
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Source class is a class for any viewer that wants
+ * to provide line numbers to extend.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Source extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Add line numbers to a block of code.
+ *
+ * @param string $code The code to number.
+ *
+ * @return string The code with line numbers added.
+ */
+ protected function _lineNumber($code, $linebreak = "\n")
+ {
+ $html = array('<table class="lineNumbered" cellspacing="0"><tr><th>');
+ for ($l = 1, $lines = substr_count($code, $linebreak) + 1; $l <= $lines; ++$l) {
+ $html[] = sprintf('<a id="l%s" href="#l%s">%s</a><br />', $l, $l, $l);
+ }
+ return implode("\n", $html) . '</th><td><div>' . $code . '</div></td></tr></table>';
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Srchighlite class renders out various content in HTML
+ * format by using Source-highlight.
+ *
+ * Source-highlight: http://www.gnu.org/software/src-highlite/
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Mike Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Srchighlite extends Horde_Mime_Viewer_Source
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+
+ // Need Horde headers for CSS tags.
+ reset($ret);
+ $ret[key($ret)]['data'] = Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+ $ret[key($ret)]['data'] .
+ Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ /* Create temporary files for Webcpp. */
+ $tmpin = Horde::getTempFile('SrcIn');
+ $tmpout = Horde::getTempFile('SrcOut', false);
+
+ /* Write the contents of our buffer to the temporary input file. */
+ file_put_contents($tmpin, $this->_mimepart->getContents());
+
+ /* Determine the language from the mime type. */
+ $lang = $this->_typeToLang($this->_mimepart->getType());
+
+ /* Execute Source-Highlite. */
+ exec($this->_conf['location'] . " --src-lang $lang --out-format xhtml --input $tmpin --output $tmpout");
+ $results = file_get_contents($tmpout);
+ unlink($tmpout);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $this->_lineNumber($results),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Attempts to determine what mode to use for the source-highlight
+ * program from a MIME type.
+ *
+ * @param string $type The MIME type.
+ *
+ * @return string The mode to use.
+ */
+ protected function _typeToLang($type)
+ {
+ switch ($type) {
+ case 'text/x-java':
+ return 'java';
+
+ case 'text/x-csrc':
+ case 'text/x-c++src':
+ case 'text/cpp':
+ return 'cpp';
+
+ case 'application/x-perl':
+ return 'perl';
+
+ case 'application/x-php':
+ case 'x-extension/phps':
+ case 'x-extension/php3s':
+ case 'application/x-httpd-php':
+ case 'application/x-httpd-php3':
+ case 'application/x-httpd-phps':
+ return 'php3';
+
+ case 'application/x-python':
+ return 'python';
+
+ // TODO: 'prolog', 'flex', 'changelog', 'ruby'
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Tgz class renders out plain or gzipped tarballs in
+ * HTML.
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Anil Madhavapeddy <anil@recoil.org>
+ * @author Michael Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Tgz extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => false,
+ 'info' => true,
+ 'inline' => true
+ );
+
+ /**
+ * The list of compressed subtypes.
+ *
+ * @var array
+ */
+ protected $_gzipSubtypes = array(
+ 'x-compressed-tar', 'tgz', 'x-tgz', 'gzip', 'x-gzip',
+ 'x-gzip-compressed', 'x-gtar'
+ );
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ /* Currently, can't do anything without tar file. */
+ $subtype = $this->_mimepart->getSubType();
+ if (in_array($subtype, array('gzip', 'x-gzip', 'x-gzip-compressed'))) {
+ return array();
+ }
+
+ $contents = $this->_mimepart->getContents();
+
+ /* Decompress gzipped files. */
+ if (in_array($subtype, $this->_gzipSubtypes)) {
+ $gzip = &Horde_Compress::singleton('gzip');
+ $contents = $gzip->decompress($contents);
+ if (is_a($contents, 'PEAR_Error') || empty($contents)) {
+ return array();
+ }
+ }
+
+ /* Obtain the list of files/data in the tar file. */
+ $tar = &Horde_Compress::singleton('tar');
+ $tarData = $tar->decompress($contents);
+ if (is_a($tarData, 'PEAR_Error')) {
+ return array();
+ }
+ $fileCount = count($tarData);
+
+ require_once 'Horde/Text.php';
+
+ $name = $this->_mimepart->getName(true);
+ if (empty($name)) {
+ $name = _("unnamed");
+ }
+
+ $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
+ '<table><tr><td align="left"><tt><span class="fixed">' .
+ Text::htmlAllSpaces(_("Archive Name") . ': ' . $name) . "\n" .
+ Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
+ Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
+ "\n\n" .
+ Text::htmlAllSpaces(
+ str_pad(_("File Name"), 62, ' ', STR_PAD_RIGHT) .
+ str_pad(_("Attributes"), 15, ' ', STR_PAD_LEFT) .
+ str_pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
+ str_pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT)
+ ) . "\n" .
+ str_repeat('-', 106) . "\n";
+
+ foreach ($tarData as $val) {
+ $text .= Text::htmlAllSpaces(
+ str_pad($val['name'], 62, ' ', STR_PAD_RIGHT) .
+ str_pad($val['attr'], 15, ' ', STR_PAD_LEFT) .
+ str_pad($val['size'], 10, ' ', STR_PAD_LEFT) .
+ str_pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT)
+ ) . "\n";
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * Return the rendered information about the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInfo()
+ {
+ return $this->_renderInline();
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Tnef class allows MS-TNEF attachments to be
+ * displayed.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Jan Schneider <jan@horde.org>
+ * @author Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Tnef extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+ if (!empty($ret)) {
+ reset($ret);
+ $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+ }
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ $tnef = &Horde_Compress::singleton('tnef');
+
+ $data = '<table border="1">';
+ $info = $tnef->decompress($this->_mimepart->getContents());
+ if (empty($info) || is_a($info, 'PEAR_Error')) {
+ $data .= '<tr><td>' . _("MS-TNEF Attachment contained no data.") . '</td></tr>';
+ } else {
+ $data .= '<tr><td>' . _("Name") . '</td><td>' . _("Mime Type") . '</td></tr>';
+ foreach ($info as $part) {
+ $data .= '<tr><td>' . $part['name'] . '</td><td>' . $part['type'] . '/' . $part['subtype'] . '</td></tr>';
+ }
+ }
+ $data .= '</table>';
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $data,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Vcard class renders out vCards in HTML format.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Jan Schneider <jan@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Vcard extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_renderInline();
+ if (!empty($ret)) {
+ reset($ret);
+ $ret[key($ret)]['data'] = Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+ $ret[key($ret)]['data'] .
+ Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+ }
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ global $registry, $prefs, $notification;
+
+ $app = false;
+ $data = $this->_mimepart->getContents();
+ $html = '';
+ $import_msg = null;
+ $title = _("vCard");
+
+ $iCal = new Horde_iCalendar();
+ if (!$iCal->parsevCalendar($data, 'VCALENDAR', $this->_mimepart->getCharset())) {
+ $notification->push(_("There was an error reading the contact data."), 'horde.error');
+ }
+
+ if (Util::getFormData('import') &&
+ Util::getFormData('source') &&
+ $registry->hasMethod('contacts/import')) {
+ $source = Util::getFormData('source');
+ $count = 0;
+ foreach ($iCal->getComponents() as $c) {
+ if (is_a($c, 'Horde_iCalendar_vcard')) {
+ $contacts = $registry->call('contacts/import',
+ array($c, null, $source));
+ if (is_a($contacts, 'PEAR_Error')) {
+ $notification->push(
+ _("There was an error importing the contact data:") . ' '
+ . $contacts->getMessage(),
+ 'horde.error');
+ continue;
+ }
+ $count++;
+ }
+ }
+ $notification->push(sprintf(ngettext(
+ "%d contact was successfully added to your address book.",
+ "%d contacts were successfully added to your address book.",
+ $count),
+ $count),
+ 'horde.success');
+ }
+
+ $html .= '<table cellspacing="1" border="0" cellpadding="1">';
+
+ $i = 0;
+ foreach ($iCal->getComponents() as $vc) {
+ if ($i > 0) {
+ $html .= '<tr><td colspan="2"> </td></tr>';
+ }
+ ++$i;
+
+ $html .= '<tr><td colspan="2" class="header">';
+ $fullname = $vc->getAttributeDefault('FN', false);
+ if ($fullname !== false) {
+ $html .= $fullname;
+ }
+ $html .= '</td></tr>';
+
+ $n = $vc->printableName();
+ if (!empty($n)) {
+ $html .= $this->_row(_("Name"), $n);
+ }
+
+ $aliases = $vc->getAttributeValues('ALIAS');
+ if (!is_a($aliases, 'PEAR_Error')) {
+ $html .= $this->_row(_("Alias"), implode("\n", $aliases));
+ }
+ $birthdays = $vc->getAttributeValues('BDAY');
+ if (!is_a($birthdays, 'PEAR_Error')) {
+ $birthday = new Horde_Date($birthdays[0]);
+ $html .= $this->_row(
+ _("Birthday"),
+ $birthday->strftime($prefs->getValue('date_format')));
+ }
+
+ $photos = $vc->getAllAttributes('PHOTO');
+ foreach ($photos as $photo) {
+ if (!isset($photo['params']['VALUE']) ||
+ String::upper($photo['params']['VALUE']) != 'URI') {
+ continue;
+ }
+ $html .= $this->_row(_("Photo"),
+ '<img src="' . htmlspecialchars($photo['value']) . '" />',
+ false);
+ }
+
+ $labels = $vc->getAllAttributes('LABEL');
+ foreach ($labels as $label) {
+ if (isset($label['params']['TYPE'])) {
+ if (!is_array($label['params']['TYPE'])) {
+ $label['params']['TYPE'] = array($label['params']['TYPE']);
+ }
+ } else {
+ $label['params']['TYPE'] = array_keys($label['params']);
+ }
+ $types = array();
+ foreach ($label['params']['TYPE'] as $type) {
+ switch(String::upper($type)) {
+ case 'HOME':
+ $types[] = _("Home Address");
+ break;
+
+ case 'WORK':
+ $types[] = _("Work Address");
+ break;
+
+ case 'DOM':
+ $types[] = _("Domestic Address");
+ break;
+
+ case 'INTL':
+ $types[] = _("International Address");
+ break;
+
+ case 'POSTAL':
+ $types[] = _("Postal Address");
+ break;
+
+ case 'PARCEL':
+ $types[] = _("Parcel Address");
+ break;
+
+ case 'PREF':
+ $types[] = _("Preferred Address");
+ break;
+ }
+ }
+ if (!count($types)) {
+ $types = array(_("Address"));
+ }
+ $html .= $this->_row(implode('/', $types), $label['value']);
+ }
+
+ $adrs = $vc->getAllAttributes('ADR');
+ foreach ($adrs as $item) {
+ if (isset($item['params']['TYPE'])) {
+ if (!is_array($item['params']['TYPE'])) {
+ $item['params']['TYPE'] = array($item['params']['TYPE']);
+ }
+ } else {
+ $item['params']['TYPE'] = array_keys($item['params']);
+ }
+ $address = $item['values'];
+ $a = array();
+ if (isset($address[VCARD_ADR_STREET])) {
+ $a[] = $address[VCARD_ADR_STREET];
+ }
+ if (isset($address[VCARD_ADR_LOCALITY])) {
+ $a[] = $address[VCARD_ADR_LOCALITY];
+ }
+ if (isset($address[VCARD_ADR_REGION])) {
+ $a[] = $address[VCARD_ADR_REGION];
+ }
+ if (isset($address[VCARD_ADR_POSTCODE])) {
+ $a[] = $address[VCARD_ADR_POSTCODE];
+ }
+ if (isset($address[VCARD_ADR_COUNTRY])) {
+ $a[] = $address[VCARD_ADR_COUNTRY];
+ }
+ $types = array();
+ foreach ($item['params']['TYPE'] as $type) {
+ switch(String::upper($type)) {
+ case 'HOME':
+ $types[] = _("Home Address");
+ break;
+
+ case 'WORK':
+ $types[] = _("Work Address");
+ break;
+
+ case 'DOM':
+ $types[] = _("Domestic Address");
+ break;
+
+ case 'INTL':
+ $types[] = _("International Address");
+ break;
+
+ case 'POSTAL':
+ $types[] = _("Postal Address");
+ break;
+
+ case 'PARCEL':
+ $types[] = _("Parcel Address");
+ break;
+
+ case 'PREF':
+ $types[] = _("Preferred Address");
+ break;
+ }
+ }
+ if (!count($types)) {
+ $types = array(_("Address"));
+ }
+ $html .= $this->_row(implode('/', $types), implode("\n", $a));
+ }
+
+ $numbers = $vc->getAllAttributes('TEL');
+
+ foreach ($numbers as $number) {
+ if (isset($number['params']['TYPE'])) {
+ if (!is_array($number['params']['TYPE'])) {
+ $number['params']['TYPE'] = array($number['params']['TYPE']);
+ }
+ foreach ($number['params']['TYPE'] as $type) {
+ $number['params'][String::upper($type)] = true;
+ }
+ }
+ if (isset($number['params']['FAX'])) {
+ $html .= $this->_row(_("Fax"), $number['value']);
+ } else {
+ if (isset($number['params']['HOME'])) {
+ $html .= $this->_row(_("Home Phone"),
+ $number['value']);
+ } elseif (isset($number['params']['WORK'])) {
+ $html .= $this->_row(_("Work Phone"),
+ $number['value']);
+ } elseif (isset($number['params']['CELL'])) {
+ $html .= $this->_row(_("Cell Phone"),
+ $number['value']);
+ } else {
+ $html .= $this->_row(_("Phone"),
+ $number['value']);
+ }
+ }
+ }
+
+ $addresses = $vc->getAllAttributes('EMAIL');
+ $emails = array();
+ foreach ($addresses as $address) {
+ if (isset($address['params']['TYPE'])) {
+ if (!is_array($address['params']['TYPE'])) {
+ $address['params']['TYPE'] = array($address['params']['TYPE']);
+ }
+ foreach ($address['params']['TYPE'] as $type) {
+ $address['params'][String::upper($type)] = true;
+ }
+ }
+ $email = '<a href="';
+ if ($registry->hasMethod('mail/compose')) {
+ $email .= $registry->call(
+ 'mail/compose',
+ array(array('to' => $address['value'])));
+ } else {
+ $email .= 'mailto:' . htmlspecialchars($address['value']);
+ }
+ $email .= '">' . htmlspecialchars($address['value']) . '</a>';
+ if (isset($address['params']['PREF'])) {
+ array_unshift($emails, $email);
+ } else {
+ $emails[] = $email;
+ }
+ }
+
+ if (count($emails)) {
+ $html .= $this->_row(_("Email"), implode("\n", $emails), false);
+ }
+
+ $title = $vc->getAttributeValues('TITLE');
+ if (!is_a($title, 'PEAR_Error')) {
+ $html .= $this->_row(_("Title"), $title[0]);
+ }
+
+ $role = $vc->getAttributeValues('ROLE');
+ if (!is_a($role, 'PEAR_Error')) {
+ $html .= $this->_row(_("Role"), $role[0]);
+ }
+
+ $org = $vc->getAttributeValues('ORG');
+ if (!is_a($org, 'PEAR_Error')) {
+ $html .= $this->_row(_("Company"), $org[0]);
+ if (isset($org[1])) {
+ $html .= $this->_row(_("Department"), $org[1]);
+ }
+ }
+
+ $notes = $vc->getAttributeValues('NOTE');
+ if (!is_a($notes, 'PEAR_Error')) {
+ $html .= $this->_row(_("Notes"), $notes[0]);
+ }
+
+ $url = $vc->getAttributeValues('URL');
+ if (!is_a($url, 'PEAR_Error')) {
+ $html .= $this->_row(
+ _("URL"),
+ '<a href="' . htmlspecialchars($url[0])
+ . '" target="_blank">' . htmlspecialchars($url[0])
+ . '</a>',
+ false);
+ }
+ }
+
+ if ($registry->hasMethod('contacts/import') &&
+ $registry->hasMethod('contacts/sources')) {
+ $html .= '<tr><td colspan="2" class="smallheader"><form action="'
+ . Horde::selfUrl() . '" method="get" name="vcard_import">'
+ . Util::formInput();
+ foreach ($_GET as $key => $val) {
+ $html .= '<input type="hidden" name="' . htmlspecialchars($key)
+ . '" value="' . htmlspecialchars($val) . '" />';
+ }
+
+ $sources = $registry->call('contacts/sources', array(true));
+ if (count($sources) > 1) {
+ $html .=
+ '<input type="submit" class="button" name="import" value="'
+ . _("Add to address book:") . '" />'
+ . '<label for="add_source" class="hidden">'
+ . _("Address Book") . '</label>'
+ . '<select id="add_source" name="source">';
+ foreach ($sources as $key => $label) {
+ $selected = ($key == $prefs->getValue('add_source'))
+ ? ' selected="selected"' : '';
+ $html .= '<option value="' . htmlspecialchars($key) . '"'
+ . $selected . '>' . htmlspecialchars($label)
+ . '</option>';
+ }
+ } else {
+ reset($sources);
+ $html .=
+ '<input type="submit" class="button" name="import" value="'
+ . _("Add to my address book") . '" />'
+ . '<input type="hidden" name="source" value="'
+ . htmlspecialchars(key($sources)) . '" />';
+ }
+
+ $html .= '</form></td></tr><tr><td> </td></tr>';
+ }
+
+ $html .= '</table>';
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status')) . $html,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+
+ /**
+ * TODO
+ */
+ protected function _row($label, $value, $encode = true)
+ {
+ if ($encode) {
+ $label = htmlspecialchars($label);
+ $value = htmlspecialchars($value);
+ }
+ return '<tr><td class="item" valign="top">' . $label .
+ '</td><td class="item" valign="top">' . nl2br($value) .
+ "</td></tr>\n";
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Webcpp class renders out various content in HTML
+ * format by using Web C Plus Plus.
+ *
+ * Web C Plus plus: http://webcpp.sourceforge.net/
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Mike Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Webcpp extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_toHTML();
+
+ /* The first 2 lines are the Content-Type line and a blank line so
+ * remove them before outputting. */
+ reset($ret);
+ $ret[key($ret)]['data'] = preg_replace("/.*\n.*\n/", '', $ret[key($ret)]['data'], 1);
+
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ $ret = $this->_toHTML();
+ reset($ret);
+ $data = $ret[key($ret)]['data'];
+
+ /* Extract the style sheet, removing any global body formatting
+ * if we're displaying inline. */
+ $res = preg_split(';(</style>)|(<style type="text/css">);', $data);
+ $style = $res[1];
+ $style = preg_replace('/\nbody\s+?{.*?}/s', '', $style);
+
+ /* Extract the content. */
+ $res = preg_split('/\<\/?pre\>/', $data);
+ $body = $res[1];
+
+ $ret[key($ret)]['data'] = '<style>' . $style . '</style><div class="webcpp" style="white-space:pre;font-family:Lucida Console,Courier,monospace;">' . $body . '</div>';
+
+ return $ret;
+ }
+
+ /**
+ * Converts the code to HTML.
+ *
+ * @return string The HTML-ified version of the MIME part contents.
+ */
+ protected function _toHTML()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ /* Create temporary files for Webcpp. */
+ $tmpin = Horde::getTempFile('WebcppIn');
+ $tmpout = Horde::getTempFile('WebcppOut');
+
+ /* Write the contents of our buffer to the temporary input file. */
+ file_put_contents($tmpin, $this->_mimepart->getContents());
+
+ /* Get the extension for the mime type. */
+ $ext = Horde_Mime_Magic::MIMEToExt($this->_mimepart->getType());
+
+ /* Execute Web C Plus Plus. Specifying the in and out files didn't
+ * work for me but pipes did. */
+ exec($this->_conf['location'] . " --pipe --pipe -x=$ext -l -a -t < $tmpin > $tmpout");
+ $results = file_get_contents($tmpout);
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $results,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Wordperfect class renders out WordPerfect documents
+ * in HTML format by using the libwpd package.
+ *
+ * libpwd website: http://libwpd.sourceforge.net/
+ *
+ * Copyright 2007-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Matt Selsky <selsky@columbia.edu>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Wordperfect extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => false,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => false
+ );
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ /* Check to make sure the viewer program exists. */
+ if (!isset($this->_conf['location']) ||
+ !file_exists($this->_conf['location'])) {
+ return array();
+ }
+
+ $tmp_wpd = Horde::getTempFile('wpd');
+ $tmp_output = Horde::getTempFile('wpd');
+
+ file_put_contents($tmp_wpd, $this->_mimepart->getContents());
+
+ exec($this->_conf['location'] . " $tmp_wpd > $tmp_output");
+
+ if (file_exists($tmp_output)) {
+ $data = file_get_contents($tmp_output);
+ } else {
+ $data = _("Unable to translate this WordPerfect document");
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => $data,
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The Horde_Mime_Viewer_Zip class renders out the contents of ZIP files in
+ * HTML format.
+ *
+ * Copyright 2000-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @author Michael Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Zip extends Horde_Mime_Viewer_Driver
+{
+ /**
+ * Can this driver render various views?
+ *
+ * @var boolean
+ */
+ protected $_capability = array(
+ 'embedded' => false,
+ 'forceinline' => true,
+ 'full' => true,
+ 'info' => false,
+ 'inline' => true
+ );
+
+ /**
+ * A callback function to use in _toHTML().
+ *
+ * @var callback
+ */
+ protected $_callback = null;
+
+ /**
+ * Return the full rendered version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _render()
+ {
+ $ret = $this->_toHTML();
+ if (!empty($ret)) {
+ reset($ret);
+ $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+ }
+ return $ret;
+ }
+
+ /**
+ * Return the rendered inline version of the Horde_Mime_Part object.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _renderInline()
+ {
+ return $this->_toHTML();
+ }
+
+ /**
+ * Converts the ZIP file to an HTML display.
+ *
+ * @return array See Horde_Mime_Viewer_Driver::render().
+ */
+ protected function _toHTML()
+ {
+ $contents = $this->_mimepart->getContents();
+
+ $zip = &Horde_Compress::singleton('zip');
+
+ /* Make sure this is a valid zip file. */
+ if ($zip->checkZipData($contents) === false) {
+ return array();
+ }
+
+ $zipInfo = $zip->decompress($contents, array('action' => HORDE_COMPRESS_ZIP_LIST));
+ if (is_a($zipInfo, 'PEAR_Error')) {
+ return array();
+ }
+ $fileCount = count($zipInfo);
+
+ /* Determine maximum file name length. */
+ $max_array = array();
+ foreach ($zipInfo as $val) {
+ $max_array[] = strlen($val['name']);
+ }
+ $maxlen = empty($max_array) ? 0 : max($max_array);
+
+ require_once 'Horde/Text.php';
+
+ $name = $this->_mimepart->getName(true);
+ if (empty($name)) {
+ $name = _("unnamed");
+ }
+
+ $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
+ '<table><tr><td align="left"><tt><span class="fixed">' .
+ Text::htmlAllSpaces(
+ _("Archive Name") . ': ' . $name . "\n" .
+ _("Archive File Size") . ': ' . strlen($contents) .
+ ' bytes' . "\n" .
+ sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount) .
+ "\n\n" .
+ String::pad(_("File Name"), $maxlen, ' ', STR_PAD_RIGHT) .
+ String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
+ String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("CRC"), 10, ' ', STR_PAD_LEFT) .
+ String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT) .
+ "\n"
+ ) . str_repeat('-', 69 + $maxlen) . "\n";
+
+ foreach ($zipInfo as $key => $val) {
+ $ratio = (empty($val['size']))
+ ? 0
+ : 100 * ($val['csize'] / $val['size']);
+
+ $val['name'] = String::pad($val['name'], $maxlen, ' ', STR_PAD_RIGHT);
+ $val['attr'] = String::pad($val['attr'], 10,' ', STR_PAD_LEFT);
+ $val['size'] = String::pad($val['size'], 10, ' ', STR_PAD_LEFT);
+ $val['date'] = String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT);
+ $val['method'] = String::pad($val['method'], 10, ' ', STR_PAD_LEFT);
+ $val['crc'] = String::pad($val['crc'], 10, ' ', STR_PAD_LEFT);
+ $val['ratio'] = String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT);
+
+ $val = array_map(array('Text', 'htmlAllSpaces'), $val);
+ if (!is_null($this->_callback)) {
+ $val = call_user_func($this->_callback, $key, $val);
+ }
+
+ $text .= $val['name'] . $val['attr'] . $val['size'] .
+ $val['date'] . $val['method'] . $val['crc'] . $val['ratio'] .
+ "\n";
+ }
+
+ return array(
+ $this->_mimepart->getMimeId() => array(
+ 'data' => nl2br($text . str_repeat('-', 69 + $maxlen) . "\n" . '</span></tt></td></tr></table>'),
+ 'status' => array(),
+ 'type' => 'text/html; charset=' . NLS::getCharset()
+ )
+ );
+ }
+}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_audio class sends audio parts to the browser for
- * handling by the browser, a plugin, or a helper application.
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_audio extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_mimepart->getContents(),
- 'status' => array(),
- 'type' => $this->_mimepart->getType()
- )
- );
- }
-}
+++ /dev/null
-<?php
-
-require_once dirname(__FILE__) . '/source.php';
-
-/**
- * The Horde_Mime_Viewer_css class renders CSS source as HTML with an effort
- * to remove potentially malicious code.
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Chuck Hagenbuch <chuck@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_css extends Horde_Mime_Viewer_source
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Attribute preg patterns.
- *
- * @var array
- */
- protected $_attrPatterns = array(
- // Attributes
- '!([-\w]+\s*):!s' => '<span class="attr"">\\1</span>:',
- // Values
- '!:(\s*)(.+?)(\s*;)!s' => ':\\1<span class="value">\\2</span><span class="eol">\\3</span>',
- // URLs
- '!(url\([\'"]?)(.*?)([\'"]?\))!s' => '<span class="url">\\1<span class="file">\\2</span>\\3</span>',
- // Colors
- '!(#[[:xdigit:]]{3,6})!s' => '<span class="color">\\1</span>',
- // Parentheses
- '!({|})!s' => '<span class="parentheses">\\1</span>',
- // Unity
- '!(em|px|%)\b!s' => '<em>\\1</em>'
- );
-
- /**
- * Handles preg patterns.
- *
- * @var array
- */
- protected $_handlesPatterns = array(
- // HTML Tags
- '!\b(body|h\d|a|span|div|acronym|small|strong|em|pre|ul|ol|li|p)\b!s' => '<span class="htag">\\1</span>\\2',
- // IDs
- '!(#[-\w]+)!s' => '<span class="id">\\1</span>',
- // Class
- '!(\.[-\w]+)\b!s' => '<span class="class">\\1</span>',
- // METAs
- '!(:link|:visited|:hover|:active|:first-letter)!s' => '<span class="metac">\\1</span>'
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
-
- // Need Horde headers for CSS tags.
- reset($ret);
- $ret[key($ret)]['data'] = Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
- $ret[key($ret)]['data'] .
- Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- $css = preg_replace_callback('!(}|\*/).*?({|/\*)!s', array($this, '_handles'), htmlspecialchars($this->_mimepart->getContents(), ENT_NOQUOTES));
- $css = preg_replace_callback('!{[^}]*}!s', array($this, '_attributes'), $css);
- $css = preg_replace_callback('!/\*.*?\*/!s', array($this, '_comments'), $css);
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_lineNumber(trim($css)),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * TODO
- */
- protected function _comments($matches)
- {
- return '<span class="comment">' .
- preg_replace('!(http://[/\w-.]+)!s', '<a href="\\1">\\1</a>', $matches[0]) .
- '</span>';
- }
-
- /**
- * TODO
- */
- protected function _attributes($matches)
- {
- return preg_replace(array_keys($this->_attrPatterns), array_values($this->_attrPatterns), $matches[0]);
- }
-
- /**
- * TODO
- */
- protected function _handles($matches)
- {
- return preg_replace(array_keys($this->_handlesPatterns), array_values($this->_handlesPatterns), $matches[0]);
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_deb class renders out lists of files in Debian
- * packages by using the dpkg tool to query the package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_deb extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
- if (!empty($ret)) {
- reset($ret);
- $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
- }
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $tmp_deb = Horde::getTempFile('horde_deb');
-
- file_put_contents($tmp_deb, $this->_mimepart->getContents());
-
- $fh = popen($this->_conf['location'] . " -f $tmp_deb 2>&1", 'r');
- while (($rc = fgets($fh, 8192))) {
- $data .= $rc;
- }
- pclose($fh);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => '<pre>' . htmlspecialchars($data) . '</pre>',
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_default class simply prints out the encapsulated
- * content. It exists as a fallback if no other intelligent rendering
- * mechanism could be used.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_default extends Horde_Mime_Viewer_Driver
-{
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_enriched class renders out plain text from enriched
- * content tags, ala RFC 1896.
- *
- * By RFC, we must do the minimal conformance measures of: A minimal
- * text/enriched implementation is one that converts "<<" to "<",
- * removes everything between a <param> command and the next balancing
- * </param> removes all other formatting commands (all text enclosed
- * in angle brackets), and outside of <nofill> environments converts
- * any series of n CRLFs to n-1 CRLFs, and converts any lone CRLF
- * pairs to SPACE.
- *
- * We don't qualify as we don't currently track the <nofill>
- * environment, that is we do CRLF conversion even if <nofill> is
- * specified in the text, but we're close at least.
- *
- * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Eric Rostetter <eric.rostetter@physics.utexas.edu>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_enriched extends Horde_Mime_Viewer_Driver
-{
- /**
- * This driver's capabilities.
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => '<html><body>' . $this->_toHTML() . '</body></html>',
- 'status' => array(),
- 'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
- )
- );
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Convert the enriched text to HTML.
- *
- * @return string The HTML-ified version of the MIME part contents.
- */
- protected function _toHTML()
- {
- $text = trim($this->_mimepart->getContents());
- if (!strlen($text)) {
- return array();
- }
-
- // We add space at the beginning and end of the string as it will
- // make some regular expression checks later much easier (so we
- // don't have to worry about start/end of line characters)
- $text = ' ' . $text . ' ';
-
- // We need to preserve << tags, so map them to ascii 1 or ascii 255
- // We make the assumption here that there would never be an ascii
- // 1 in an email, which may not be valid, but seems reasonable...
- // ascii 255 would work if for some reason you don't like ascii 1
- // ascii 0 does NOT seem to work for this, though I'm not sure why
- $text = str_replace('<<', chr(1), $text);
-
- // Remove any unrecognized tags in the text (via RFC minimal specs)
- // any tags we just don't want to implement can also be removed here
- // Note that this will remove any html links, but this is intended
- $implementedTags = '<param><bold><italic><underline><fixed><excerpt>' .
- '<smaller><bigger><center><color><fontfamily>' .
- '<flushleft><flushright><flushboth><paraindent>';
- // $unImplementedTags = '<nofill><lang>';
- $text = strip_tags($text, $implementedTags);
-
- // restore the << tags as < tags now...
- $text = str_replace(chr(1), '<<', $text);
- // $text = str_replace(chr(255), '<', $text);
-
- $replace = array(
- // Get color parameters into a more useable format.
- '/<color><param>([\da-fA-F]+),([\da-fA-F]+),([\da-fA-F]+)<\/param>/Uis' => '<color r=\1 g=\2 b=\3>',
- '/<color><param>(red|blue|green|yellow|cyan|magenta|black|white)<\/param>/Uis' => '<color n=\1>',
-
- // Get font family parameters into a more useable format.
- '/<fontfamily><param>(\w+)<\/param>/Uis' => '<fontfamily f=\1>',
-
- /* Just remove any remaining parameters -- we won't use them.
- * Any tags with parameters that we want to implement will have
- * come before this. Someday we hope to use these tags (e.g. for
- * <color><param> tags). */
- '/<param>.*<\/param>/Uis' => '',
-
- /* Single line breaks become spaces, double line breaks are a
- * real break. This needs to do <nofill> tracking to be compliant
- * but we don't want to deal with state at this time, so we fake
- * it some day we should rewrite this to handle <nofill>
- * correctly. */
- '/([^\n])\r\n([^\r])/' => '\1 \2',
- '/(\r\n)\r\n/' => '\1'
- );
- $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
- // We try to protect against bad stuff here.
- $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
-
- // Now convert the known tags to html. Try to remove any tag
- // parameters to stop people from trying to pull a fast one
- $replace = array(
- '/(?<!<)<bold.*>(.*)<\/bold>/Uis' => '<span style="font-weight: bold">\1</span>',
- '/(?<!<)<italic.*>(.*)<\/italic>/Uis' => '<span style="font-style: italic">\1</span>',
- '/(?<!<)<underline.*>(.*)<\/underline>/Uis' => '<span style="text-decoration: underline">\1</span>'
- );
- $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
- $text = preg_replace_callback('/(?<!<)<color r=([\da-fA-F]+) g=([\da-fA-F]+) b=([\da-fA-F]+)>(.*)<\/color>/Uis', array($this, 'colorize'), $text);
-
- $replace = array(
- '/(?<!<)<color n=(red|blue|green|yellow|cyan|magenta|black|white)>(.*)<\/color>/Uis' => '<span style="color: \1">\2</span>',
- '/(?<!<)<fontfamily>(.*)<\/fontfamily>/Uis' => '\1',
- '/(?<!<)<fontfamily f=(\w+)>(.*)<\/fontfamily>/Uis' => '<span style="font-family: \1">\2</span>',
- '/(?<!<)<smaller.*>/Uis' => '<span style="font-size: smaller">',
- '/(?<!<)<\/smaller>/Uis' => '</span>',
- '/(?<!<)<bigger.*>/Uis' => '<span style="font-size: larger">',
- '/(?<!<)<\/bigger>/Uis' => '</span>',
- '/(?<!<)<fixed.*>(.*)<\/fixed>/Uis' => '<font face="fixed">\1</font>',
- '/(?<!<)<center.*>(.*)<\/center>/Uis' => '<div align="center">\1</div>',
- '/(?<!<)<flushleft.*>(.*)<\/flushleft>/Uis' => '<div align="left">\1</div>',
- '/(?<!<)<flushright.*>(.*)<\/flushright>/Uis' => '<div align="right">\1</div>',
- '/(?<!<)<flushboth.*>(.*)<\/flushboth>/Uis' => '<div align="justify">\1</div>',
- '/(?<!<)<paraindent.*>(.*)<\/paraindent>/Uis' => '<blockquote>\1</blockquote>',
- '/(?<!<)<excerpt.*>(.*)<\/excerpt>/Uis' => '<blockquote>\1</blockquote>'
- );
- $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
- // Replace << with < now (from translated HTML form).
- $text = str_replace('<<', '<', $text);
-
- // Now we remove the leading/trailing space we added at the
- // start.
- $text = preg_replace('/^ (.*) $/s', '\1', $text);
-
- // Make URLs clickable.
- require_once 'Horde/Text/Filter.php';
- $text = Text_Filter::filter($text, 'linkurls', array('callback' => 'Horde::externalUrl'));
-
- /* Wordwrap -- note this could impact on our above RFC compliance *IF*
- * we honored nofill tags (which we don't yet). */
- $text = str_replace(array("\t", ' ', "\n "), array(' ', ' ', "\n "), $text);
-
- if ($text[0] == ' ') {
- $text = ' ' . substr($text, 1);
- }
-
- return '<p class="fixed">' . nl2br($text) . '</p>';
- }
-
- /**
- * TODO
- */
- public function colorize($colors)
- {
- for ($i = 1; $i < 4; $i++) {
- $colors[$i] = sprintf('%02X', round(hexdec($colors[$i]) / 255));
- }
- return '<span style="color: #' . $colors[1] . $colors[2] . $colors[3] . '">' . $colors[4] . '</span>';
- }
-}
+++ /dev/null
-<?php
-
-require_once dirname(__FILE__) . '/source.php';
-
-/**
- * The Horde_Mime_Viewer_enscript class renders out various content in HTML
- * format by using GNU Enscript.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_enscript extends Horde_Mime_Viewer_source
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_toHTML(false),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_toHTML(true),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Converts the code to HTML.
- *
- * @param boolean $inline Is this an inline display?
- *
- * @return string The HTML-ified version of the MIME part contents.
- */
- protected function _toHTML($inline)
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- /* Create temporary files for input to Enscript. Note that we can't
- * use a pipe, since enscript must have access to the whole file to
- * determine its type for coloured syntax highlighting. */
- $tmpin = Horde::getTempFile('enscriptin');
-
- /* Write the contents of our buffer to the temporary input file. */
- file_put_contents($tmpin, $this->_mimepart->getContents());
-
- /* Execute the enscript command. */
- $lang = escapeshellarg($this->_typeToLang($this->_mimepart->getType()));
- $results = shell_exec($this->_conf['location'] . " -E$lang --language=html --color --output=- < $tmpin");
-
- /* Strip out the extraneous HTML from enscript. */
- if ($inline) {
- $res_arr = preg_split('/\<\/?pre\>/i', $results);
- if (count($res_arr) == 3) {
- $results = trim($res_arr[1]);
- }
- }
-
- return $this->_lineNumber($results);
- }
-
- /**
- * Attempts to determine what language to use for the enscript program
- * from a MIME type.
- *
- * @param string $type The MIME type.
- *
- * @return string The enscript 'language' parameter string.
- */
- protected function _typeToLang($type)
- {
- include_once dirname(__FILE__) . '/../Magic.php';
- $ext = Horde_Mime_Magic::MIMEToExt($type);
-
- switch ($ext) {
- case 'cs':
- return 'java';
-
- case 'el':
- return 'elisp';
-
- case 'h':
- return 'c';
-
- case 'C':
- case 'H':
- case 'cc':
- case 'hh':
- case 'c++':
- case 'cxx':
- case 'cpp':
- return 'cpp';
-
- case 'htm':
- case 'shtml':
- case 'xml':
- return 'html';
-
- case 'js':
- return 'javascript';
-
- case 'pas':
- return 'pascal';
-
- case 'al':
- case 'cgi':
- case 'pl':
- case 'pm':
- return 'perl';
-
- case 'ps':
- return 'postscript';
-
- case 'vb':
- return 'vba';
-
- case 'vhd':
- return 'vhdl';
-
- case 'patch':
- case 'diff':
- return 'diffu';
-
- default:
- return $ext;
- }
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_html class renders out HTML text with an effort to
- * remove potentially malicious code.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (GPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @author Jon Parise <jon@horde.org>
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_html extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $html = $this->_cleanHTML($this->_mimepart->getContents(), false);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $html['html'],
- 'status' => array(),
- 'type' => $this->_mimepart->getType(true)
- )
- );
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- $html = $this->_cleanHTML($this->_mimepart->getContents(), true);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => String::convertCharset($html['data'], $this->_mimepart->getCharset()),
- 'status' => $html['status'],
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Filters active content, dereferences external links, detects phishing,
- * etc.
- *
- * @todo Use IP checks from
- * http://lxr.mozilla.org/mailnews/source/mail/base/content/phishingDetector.js.
- *
- * @param string $data The HTML data.
- * @param boolean $inline Are we viewing inline?
- *
- * @return array Two elements: 'html' and 'status'.
- */
- protected function _cleanHTML($data, $inline)
- {
- global $browser, $prefs;
-
- $phish_warn = false;
-
- /* Deal with <base> tags in the HTML, since they will screw up our own
- * relative paths. */
- if (preg_match('/<base href="?([^"> ]*)"? ?\/?>/i', $data, $matches)) {
- $base = $matches[1];
- if (substr($base, -1) != '/') {
- $base .= '/';
- }
-
- /* Recursively call _cleanHTML() to prevent clever fiends from
- * sneaking nasty things into the page via $base. */
- $base = $this->_cleanHTML($base, $inline);
-
- /* Attempt to fix paths that were relying on a <base> tag. */
- if (!empty($base)) {
- $pattern = array('|src=(["\'])([^:"\']+)\1|i',
- '|src=([^: >"\']+)|i',
- '|href= *(["\'])([^:"\']+)\1|i',
- '|href=([^: >"\']+)|i');
- $replace = array('src=\1' . $base . '\2\1',
- 'src=' . $base . '\1',
- 'href=\1' . $base . '\2\1',
- 'href=' . $base . '\1');
- $data = preg_replace($pattern, $replace, $data);
- }
- }
-
- require_once 'Horde/Text/Filter.php';
- $strip_style_attributes = (($browser->isBrowser('mozilla') &&
- $browser->getMajor() == 4) ||
- $browser->isBrowser('msie'));
- $strip_styles = $inline || $strip_style_attributes;
- $data = Text_Filter::filter($data, 'xss',
- array('body_only' => $inline,
- 'strip_styles' => $strip_styles,
- 'strip_style_attributes' => $strip_style_attributes));
-
- /* Check for phishing exploits. */
- if ($this->getConfigParam('phishing_check')) {
- if (preg_match('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:[^>]*>\s*(?:\\1:\/\/)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^<]*<\/a)?/i', $data, $m)) {
- /* Check 1: Check for IP address links, but ignore if the link
- * text has the same IP address. */
- if (!isset($m[3]) || ($m[2] != $m[3])) {
- if (isset($m[3])) {
- $data = preg_replace('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/' . preg_quote($m[2], '/') . '(?:[^>]*>\s*(?:$1:\/\/)?' . preg_quote($m[3], '/') . '[^<]*<\/a)?/i', 'class="mimeStatusWarning" $0', $data);
- }
- $phish_warn = true;
- }
- } elseif (preg_match_all('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/([^\s"\'>]+)["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?(.*?)<\/a/is', $data, $m)) {
- /* $m[1] = Link; $m[2] = Target
- * Check 2: Check for links that point to a different host than
- * the target url; if target looks like a domain name, check it
- * against the link. */
- for ($i = 0, $links = count($m[0]); $i < $links; ++$i) {
- $link = strtolower(urldecode($m[1][$i]));
- $target = strtolower(preg_replace('/^(http|https|ftp):\/\//', '', strip_tags($m[2][$i])));
- if (preg_match('/^[-._\da-z]+\.[a-z]{2,}/i', $target) &&
- (strpos($link, $target) !== 0) &&
- (strpos($target, $link) !== 0)) {
- /* Don't consider the link a phishing link if the
- * domain is the same on both links (e.g.
- * adtracking.example.com & www.example.com). */
- preg_match('/\.?([^\.\/]+\.[^\.\/]+)[\/?]/', $link, $host1);
- preg_match('/\.?([^\.\/]+\.[^\.\/ ]+)([\/ ].*)?$/', $target, $host2);
- if (!(count($host1) && count($host2)) ||
- (strcasecmp($host1[1], $host2[1]) !== 0)) {
- $data = preg_replace('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/' . preg_quote($m[1][$i], '/') . '["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?' . preg_quote($m[2][$i], '/') . '<\/a/is', 'class="mimeStatusWarning" $0', $data);
- $phish_warn = true;
- }
- }
- }
- }
- }
-
- /* Try to derefer all external references. */
- $data = preg_replace_callback('/href\s*=\s*(["\'])?((?(1)[^\1]*?|[^\s>]+))(?(1)\1|)/i', array($this, '_dereferCallback'), $data);
-
- /* Get phishing warning. */
- $status = array();
- if ($inline && $phish_warn) {
- $warning = array(
- sprintf(_("%s: This message may not be from whom it claims to be. Beware of following any links in it or of providing the sender with any personal information."), _("Warning")),
- _("The links that caused this warning have this background color:") . ' <span class="mimeStatusWarning">' . _("EXAMPLE") . '.</span>'
- );
-
- if (!$inline) {
- $temp = array();
- foreach ($phish_warning as $val) {
- $temp[] = String::convertCharset($val, NLS::getCharset(), $this->_mimepart->getCharset());
- }
- $warning = $temp;
- }
-
- $status[] = array(
- 'class' => 'mimestatuswarning',
- 'text' => $warning
- );
- }
-
- return array('html' => $data, 'status' => $status);
- }
-
- /**
- * TODO
- *
- * @param string $m TODO
- *
- * @return string TODO
- */
- protected function _dereferCallback($m)
- {
- return 'href="' . Horde::externalUrl($m[2]) . '"';
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_images class allows images to be displayed.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_images extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_mimepart->getContents(),
- 'status' => array(),
- 'type' => $this->_getType()
- )
- );
- }
-
- /**
- * Return the content-type to use for the image.
- *
- * @return string The content-type of the image.
- */
- protected function _getType()
- {
- $type = $this->_mimepart->getType();
-
- switch ($type) {
- case 'image/pjpeg':
- /* image/jpeg and image/pjpeg *appear* to be the same entity, but
- * Mozilla (for one) don't seem to want to accept the latter. */
- return 'image/jpeg';
-
- case 'image/x-png':
- /* image/x-png == image/png. */
- return 'image/png';
-
- default:
- return $type;
- }
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_msexcel class renders out Microsoft Excel
- * documents in HTML format by using the Gnumeric package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_msexcel extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $tmp_xls = Horde::getTempFile('horde_msexcel');
- $tmp_out = Horde::getTempFile('horde_msexcel');
-
- file_put_contents($tmp_xls, $this->_mimepart->getContents());
- $args = ' -E Gnumeric_Excel:excel_dsf -T Gnumeric_html:html40 ' . $tmp_xls . ' ' . $tmp_out;
-
- exec($this->_conf['location'] . $args);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => file_get_contents($tmp_out),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_mspowerpoint class renders out Microsoft Powerpoint
- * documents in HTML format by using the xlHtml package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_mspowerpoint extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $data = '';
- $tmp_ppt = Horde::getTempFile('horde_mspowerpoint');
-
- file_put_contents($tmp_ppt, $this->_mimepart->getContents());
-
- $fh = popen($this->_conf['location'] . " $tmp_ppt 2>&1", 'r');
- while (($rc = fgets($fh, 8192))) {
- $data .= $rc;
- }
- pclose($fh);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $data,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_msword class renders out Microsoft Word documents
- * in HTML format by using the AbiWord package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_msword extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $tmp_word = Horde::getTempFile('msword');
- $tmp_output = Horde::getTempFile('msword');
- $tmp_file = str_replace(Horde::getTempDir() . '/', '', $tmp_output);
-
- file_put_contents($tmp_word, $this->_mimepart->getContents());
- $args = ' --to=html --to-name=' . $tmp_output . ' ' . $tmp_word;
-
- exec($this->_conf['location'] . $args);
-
- if (file_exists($tmp_output)) {
- $data = file_get_contents($tmp_output);
- $type = 'text/html';
- } else {
- $data = _("Unable to translate this Word document");
- $type = 'text/plain';
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $data,
- 'status' => array(),
- 'type' => $type . '; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_ooo class renders out OpenOffice.org documents in
- * HTML format.
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Marko Djukic <marko@oblo.com>
- * @author Jan Schneider <jan@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_ooo extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $has_xslt = Util::extensionExists('xslt');
- $has_ssfile = function_exists('domxml_xslt_stylesheet_file');
- if (($use_xslt = $has_xslt || $has_ssfile)) {
- $tmpdir = Util::createTempDir(true);
- }
-
- $fnames = array('content.xml', 'styles.xml', 'meta.xml');
- $tags = array(
- 'text:p' => 'p',
- 'table:table' => 'table border="0" cellspacing="1" cellpadding="0" ',
- 'table:table-row' => 'tr bgcolor="#cccccc"',
- 'table:table-cell' => 'td',
- 'table:number-columns-spanned=' => 'colspan='
- );
-
- require_once 'Horde/Compress.php';
- $zip = &Horde_Compress::singleton('zip');
- $list = $zip->decompress($this->_mimepart->getContents(), array('action' => HORDE_COMPRESS_ZIP_LIST));
-
- foreach ($list as $key => $file) {
- if (in_array($file['name'], $fnames)) {
- $content = $zip->decompress($this->_mimepart->getContents(), array(
- 'action' => HORDE_COMPRESS_ZIP_DATA,
- 'info' => $list,
- 'key' => $key
- ));
-
- if ($use_xslt) {
- file_put_contents($tmpdir . $file['name'], $content);
- } elseif ($file['name'] == 'content.xml') {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => str_replace(array_keys($tags), array_values($tags), $content),
- 'status' => array(),
- 'type' => 'text/html; charset=UTF-8'
- )
- );
- }
- }
- }
-
- if (!Util::extensionExists('xslt')) {
- return array();
- }
-
- $xsl_file = dirname(__FILE__) . '/ooo/main_html.xsl';
-
- if ($has_ssfile) {
- /* Use DOMXML */
- $xslt = domxml_xslt_stylesheet_file($xsl_file);
- $dom = domxml_open_file($tmpdir . 'content.xml');
- $result = @$xslt->process($dom, array(
- 'metaFileURL' => $tmpdir . 'meta.xml',
- 'stylesFileURL' => $tmpdir . 'styles.xml',
- 'disableJava' => true)
- );
- $result = $xslt->result_dump_mem($result);
- } else {
- // Use XSLT
- $xslt = xslt_create();
- $result = @xslt_process($xslt, $tmpdir . 'content.xml', $xsl_file, null, null, array(
- 'metaFileURL' => $tmpdir . 'meta.xml',
- 'stylesFileURL' => $tmpdir . 'styles.xml',
- 'disableJava' => true)
- );
- if (!$result) {
- $result = xslt_error($xslt);
- }
- xslt_free($xslt);
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $result,
- 'status' => array(),
- 'type' => 'text/html; charset=UTF-8'
- )
- );
- }
-}
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- extension-element-prefixes="xt"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
-
- <!-- ************ -->
- <!-- *** body *** -->
- <!-- ************ -->
-
-
- <xsl:template match="/*/office:body">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- isDebugMode-START: only isDebugMode purpose: shows the inlined style attributes of the temporary variable -->
- <xsl:if test="$isDebugMode and not($outputType = 'CSS_HEADER')">
- <xsl:element name="debug_tree_of_styles"><xsl:text>
- </xsl:text><xsl:for-each select="$collectedGlobalData/allstyles/*">
-<xsl:text> </xsl:text><xsl:value-of select="name()"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
- </xsl:text>
- </xsl:for-each>
- </xsl:element>
- </xsl:if>
- <!-- isDebugMode-END -->
-
-
- <!-- not using of 'apply-styles-and-content' as the content table information migth have been added to 'collectedGlobalData' variable -->
- <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
-
- <!-- Usability feature, a link to the Content talbe above all level 1 header -->
- <xsl:if test="$contentTableHeadings">
- <xsl:call-template name="add-child-document-usability-links"/>
- </xsl:if>
-
-
- <xsl:choose>
- <xsl:when test="not($outputType = 'WML') and not($outputType = 'PALM')">
- <xsl:choose>
- <!--If the input document is a global document and embed child documents (links) the transformation of the children will be started as well.
- This is necessary as child documents do not know anything about their embedding into a global document. Chapters of childs
- always start to count by zero instead of continously numbering.
- For this, the chapter numbers of the current document (as a sequence of a global document) is dependent
- of the number of chapter of the same level in preceding documents.
- In case of multiple children, for usability reasons some linking is gonna be offered and the URLs of the content-table,
- preceding and following file have to be given for the transformation.
- -->
- <xsl:when test="/*/@office:class='text-global' and /*/office:body/text:section/text:section-source/@xlink:href">
- <!-- the children will be called later with a modified 'collectedGlobalData' variable -->
- <xsl:call-template name="transform-global-document-and-children">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:otherwise>
- </xsl:choose>
-
-
-
- <!-- Usability feature, a link to the Content talbe above all level 1 header -->
- <xsl:if test="$contentTableHeadings">
- <xsl:call-template name="add-child-document-usability-links"/>
- </xsl:if>
-
-
- </xsl:template>
-
-
-
-
- <!-- deactivating default template -->
- <xsl:template match="*"/>
-
-
- <!-- allowing all matched text nodes -->
- <xsl:template match="text()">
-<!-- WML <xsl:value-of select="normalize-space(.)"/> -->
- <xsl:value-of select="."/>
- </xsl:template>
-
-
-
- <!-- ################### -->
- <!-- ### INLINE-TEXT ### -->
- <!-- ################### -->
-
-
- <!-- ****************** -->
- <!-- *** Whitespace *** -->
- <!-- ****************** -->
-
-
- <xsl:template match="text:s">
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="@text:c"/>
- </xsl:call-template>
- </xsl:template>
-
-
- <!--write the number of 'whitespaces' -->
- <xsl:template name="write-breakable-whitespace">
- <xsl:param name="whitespaces"/>
-
- <!--write two space chars as the normal white space character will be stripped
- and the other is able to break -->
- <xsl:text> </xsl:text>
- <xsl:if test="$whitespaces >= 2">
- <xsl:call-template name="write-breakable-whitespace-2">
- <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
- </xsl:call-template>
- </xsl:if>
- </xsl:template>
-
-
- <!--write the number of 'whitespaces' -->
- <xsl:template name="write-breakable-whitespace-2">
- <xsl:param name="whitespaces"/>
- <!--write two space chars as the normal white space character will be stripped
- and the other is able to break -->
- <xsl:text> </xsl:text>
- <xsl:if test="$whitespaces >= 2">
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
- </xsl:call-template>
- </xsl:if>
- </xsl:template>
-
-
-
-
- <!-- *************** -->
- <!-- *** Textbox *** -->
- <!-- *************** -->
-
- <xsl:template match="draw:text-box">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <!-- or -->
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
- <xsl:element name="span">
- <xsl:if test="@fo:min-height | @svg:width">
- <xsl:attribute name="style">
- <xsl:choose>
- <xsl:when test="not(@svg:width)">
- <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test="not(@fo:min-height)">
- <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
- <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:if>
- <xsl:apply-templates select="@draw:name"/>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!-- 2DO prove best usage for PALM -->
- <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:element name="span">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!-- 2DO prove best usage for WML -->
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <!-- no nested p tags in wml1.1 allowed -->
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!-- ID / NAME of text-box -->
- <xsl:template match="@draw:name">
-
- <xsl:attribute name="id">
- <xsl:value-of select="."/>
- </xsl:attribute>
- </xsl:template>
-
-
-
- <!-- ****************** -->
- <!-- *** Paragraphs *** -->
- <!-- ****************** -->
-
- <xsl:template match="text:p | draw:page">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:choose>
- <!-- in palm paragraphs children of text:list-items are better shown without 'p' tag-->
- <xsl:when test="name(parent::*) = 'text:list-item'">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <!-- no nested p tags in wml1.1 allowed -->
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- ***************** -->
- <!-- *** Text Span *** -->
- <!-- ***************** -->
-
- <xsl:template match="text:span">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="span">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="span">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <!-- no nested p tags in wml1.1 allowed -->
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- **************** -->
- <!-- *** Headings *** -->
- <!-- **************** -->
-
- <xsl:template match="text:h">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- Every heading element will get an unique anchor for its file, from its hiearchy level and name:
- For example: The heading title 'My favorite heading' might get <a name="1+2+2+My+favorite+heading"/> -->
- <xsl:choose>
- <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
- <!-- The URL linking of an table-of-content is due to a bug (cmp. bug id# 102311) not mapped as URL in the XML.
- Linking of the table-of-content can therefore only be archieved by a work-around in HTML -->
- <xsl:call-template name="create-heading">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <!-- necessary as anchor for the content table -->
- <xsl:call-template name="create-heading-anchor">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
-
- <!-- no embedding the orginal header, as an explicit anchor might be already set -->
- <xsl:call-template name="create-heading">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- default matching for header elements -->
- <xsl:template name="create-heading">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
-
- <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
- <xsl:element name="{$headertyp}">
-
- <!-- outline style 'text:min-label-width' is interpreted as a CSS 'margin-left' attribute -->
- <xsl:variable name="min-label" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/style:properties/@text:min-label-width"/>
- <xsl:if test="$min-label">
- <xsl:attribute name="style"><xsl:text>margin-left:</xsl:text><xsl:value-of select="$min-label"/><xsl:text>;</xsl:text></xsl:attribute>
- </xsl:if>
-
-
- <xsl:attribute name="class"><xsl:value-of select="translate(@text:style-name, '. %()/\', '')"/></xsl:attribute>
-
- <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
- <xsl:if test="string-length($office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@style:num-format) != 0">
-
- <xsl:choose>
- <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
- <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level',
- furthermore when the current document is referenced by a global document - as part of a whole sequence of documents -,
- the chapter no. is dependent of the amount of started headers in preceding documents.
- If the 'text:start-value is not set the default value of '1' has to be taken. -->
- <xsl:variable name="startValue" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
- <xsl:choose>
- <xsl:when test="$startValue">
- <xsl:choose>
- <xsl:when test="@text:level='1'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel1
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='2'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel2
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='3'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel3
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='4'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel4
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='5'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel5
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='6'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel6
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='7'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel7
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='8'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel8
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='9'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel9
- + $startValue"/>
- </xsl:when>
- <xsl:when test="@text:level='10'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel10
- + $startValue"/>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:choose>
- <xsl:when test="@text:level='1'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel1
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='2'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel2
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='3'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel3
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='4'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel4
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='5'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel5
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='6'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel6
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='7'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel7
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='8'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel8
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='9'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel9
- + 1"/>
- </xsl:when>
- <xsl:when test="@text:level='10'">
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $precedingChapterLevel10
- + 1"/>
- </xsl:when>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="get-absolute-chapter-no">
- <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>    </xsl:text>
- </xsl:if>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- </xsl:element>
- </xsl:when>
-
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
- <xsl:element name="{$headertyp}">
-
- <xsl:apply-templates select="@text:style-name">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
- <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
-
- <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
- <xsl:text>    </xsl:text>
- </xsl:if>
-
- </xsl:element>
- </xsl:when>
-
- <!-- 2DO: add Chapter No. for PALM and WML <-> problem nested apply-templates -->
-
- <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
- <xsl:element name="{$headertyp}">
-
-
- <!-- All children content have to be nested in the styles (e.g. <i><b>ANY CONTENT</b></i>)
- for this xsl:apply-templates will be called later / implicit -->
- <xsl:call-template name="create-attribute-ALIGN">
- <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
- <xsl:with-param name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/@text:style-name]"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <!-- no nested p tags in wml1.1 allowed -->
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <!-- since no header styles exist, an emphasis is used -->
- <xsl:element name="em">
-
- <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
- <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
-
- <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
- <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
- + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
- <xsl:text>    </xsl:text>
- </xsl:if>
-
- <xsl:apply-templates select="@text:style-name">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <!-- since no header styles exist, an emphasis is used -->
- <xsl:element name="em">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- ************* -->
- <!-- *** Link *** -->
- <!-- ************* -->
-
- <xsl:template match="text:a | draw:a">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:call-template name="create-common-link">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:template>
-
-
- <xsl:template name="create-common-link">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <xsl:when test="not($outputType = 'WML')">
- <xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- <!--<xsl:attribute name="class">ContentLink</xsl:attribute>-->
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <!-- no nested p tags in wml1.1 allowed -->
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- <xsl:apply-templates select="descendant::text()"/>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- <xsl:apply-templates select="descendant::text()"/>
- </xsl:element>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
-
-
- <!-- ******************* -->
- <!-- *** Image Link *** -->
- <!-- ******************* -->
-
- <xsl:template match="draw:image">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- NO IMAGES SUPPLIED FOR WAP OR PALM -->
- <xsl:if test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
-
- <xsl:element name="img">
- <xsl:if test="@svg:width">
- <xsl:attribute name="width">
- <xsl:call-template name="convert2pixel">
- <xsl:with-param name="value" select="@svg:width"/>
- </xsl:call-template>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="@svg:height">
- <xsl:attribute name="height">
- <xsl:call-template name="convert2pixel">
- <xsl:with-param name="value" select="@svg:height"/>
- </xsl:call-template>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="svg:desc">
- <xsl:attribute name="alt">
- <xsl:value-of select="svg:desc"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:choose>
- <!-- for images jared in open office document -->
- <xsl:when test="contains(@xlink:href, '#Pictures/')">
- <!-- creating an absolute http URL to the packed image file -->
- <xsl:attribute name="src"><xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after(@xlink:href, '#Pictures/'), $optionalURLSuffix)"/></xsl:attribute>
- </xsl:when>
-<!-- Due to a XT bug no DOS ':' before DRIVE letter is allowed, it would result in a unkown protoco exception, but a file URL for a DOS
- path needs the DRIVE letter, therefore all relative URLs remain relativ
-
- <xsl:when test="contains(@xlink:href,'//') or (substring(@xlink:href,2,1) = ':') or starts-with(@xlink:href, '/')">
- <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- </xsl:when>
- <xsl:otherwise>
- <!~~ creating a absolute path/URL for the referenced resource ~~>
- <xsl:attribute name="src"><xsl:value-of select="concat($absoluteSourceDirRef, @xlink:href, $optionalURLSuffix)"/></xsl:attribute>
- </xsl:otherwise>
--->
- <xsl:otherwise>
- <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- <!-- adding a line break to make the presentation more even with the OOo view -->
- <xsl:element name="br"/>
- </xsl:if>
- </xsl:template>
-
-
-
- <!-- ******************** -->
- <!-- *** ordered list *** -->
- <!-- ******************** -->
-
- <xsl:template match="text:ordered-list">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="ol">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="ol">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:element name="ol">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <xsl:choose>
- <!-- simulating content break of capsulated list elements -->
- <xsl:when test="ancestor::text:list-item">
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <!-- simulating content break of capsulated list elements -->
- <xsl:element name="br"></xsl:element>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <!-- simulating content break of capsulated list elements -->
- <xsl:element name="br"></xsl:element>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- ********************** -->
- <!-- *** unordered list *** -->
- <!-- ********************** -->
-
- <xsl:template match="text:unordered-list">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="ul">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="ul">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:element name="ul">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <xsl:choose>
- <!-- simulating content break of capsulated list elements -->
- <xsl:when test="ancestor::text:list-item">
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <!-- simulating content break of capsulated list elements -->
- <xsl:element name="br"></xsl:element>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <!-- simulating content break of capsulated list elements -->
- <xsl:element name="br"></xsl:element>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- ****************** -->
- <!-- *** list item *** -->
- <!-- ****************** -->
-
- <xsl:template match="text:list-item">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="li">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="li">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:element name="li">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <!-- simulating list elements -->
- <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
- <xsl:text>* </xsl:text>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- <!-- list item break simulation (not in a table)-->
- <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
- <xsl:element name="br"/>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <!-- simulating list elements -->
- <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
- <xsl:text>* </xsl:text>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- <!-- list item break simulation (not in a table)-->
- <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
- <xsl:element name="br"/>
- </xsl:if>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- ********************************************** -->
- <!-- *** Text Section (contains: draw:text-box) *** -->
- <!-- ********************************************** -->
-
- <xsl:template match="text:section">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:if test="not(contains(@text:display, 'none'))">
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="span">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="span">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <!--+++++ PALM 3.2 SUBSET INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:choose>
- <xsl:when test="name(parent::*) = 'text:list-item'">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <!--+++++ WML / WAP +++++-->
- <xsl:otherwise>
- <xsl:choose>
- <xsl:when test="not($outputType = 'WML')">
- <xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <!-- no nested p tags in wml1.1 allowed -->
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:if>
- </xsl:template>
-
-
-
- <xsl:template match="text:line-break">
- <xsl:element name="br"/>
- </xsl:template>
-
-
-<!--
- TABHANDLING PROBLEM: Tabs are possible to be shown in the HTML text file, but will be later stripped as whitespaces.
- To prevent this one way would be the PRE tag which unfortunately ALWAYS result into a line-break. No surrounding NOBR tags help.
-
- <xsl:template match="text:tab-stop">
- <xsl:if test="not(preceding-sibling::text:tab-stop)">
- <xsl:element name="pre"><xsl:text>	</xsl:text><xsl:for-each select="following-sibling::text:tab-stop"><xsl:text>	</xsl:text></xsl:for-each></xsl:element>
- </xsl:if>
- </xsl:template>
-
- <xsl:template match="text:tab-stop"><xsl:text>	</xsl:text></xsl:template>
--->
- <!-- HOTFIX: 8 non-breakable-spaces instead of a TAB is a hack sometimes less Tabs are needed and the code more difficult to read -->
- <xsl:template match="text:tab-stop">
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="8"/>
- </xsl:call-template>
- </xsl:template>
-
- <!-- currently there have to be an explicit call of the style attribute nodes, maybe the attributes nodes have no priority only order relevant-->
- <!-- STRANGE: checked with biorythm.sxc a simple xsl:apply-templates did not recognice the styles. Maybe caused by the template match order? -->
- <xsl:template name="apply-styles-and-content">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:template>
-
-
- <xsl:template match="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name-->
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:attribute name="class"><xsl:value-of select="translate(., '. %()/\', '')"/></xsl:attribute>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:attribute name="style"><xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/.]"/></xsl:attribute>
- </xsl:when>
-
- <!--+++++ PALM 3.2 SUBSET INLINED WAY and WML / WAP +++++-->
- <xsl:when test="$outputType = 'PALM' or $outputType = 'WML'">
- <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
- <xsl:variable name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/.]"/>
- <!-- changing the context node -->
- <xsl:for-each select="parent::*">
- <xsl:call-template name="create-nested-format-tags">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template match="text:sequence">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:template>
-
-
-</xsl:stylesheet>
+++ /dev/null
- <!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- extension-element-prefixes="xt"
- xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
- xmlns:sxghelper="http://www.jclark.com/xt/java/com.sun.star.xslt.helper.SxgChildTransformer"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
-
-
- <!-- ********************************************** -->
- <!-- *** Global Document - Table of Content *** -->
- <!-- ********************************************** -->
-
-
-
- <xsl:template match="text:table-of-content">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:template>
-
-
-
- <xsl:template match="text:index-body">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:apply-templates mode="content-table">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:template>
-
-
-
- <xsl:template match="text:index-title" mode="content-table">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:template>
-
- <xsl:template match="text:reference-ref">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- Java is needed as we have to encode the relative links (bug#102311) -->
- <xsl:if test="not($isJavaDisabled)">
- <xsl:element name="a">
- <xsl:attribute name="href">
- <xsl:text>#</xsl:text>
- <xsl:call-template name="encode-string">
- <!-- the space has to be normalized,
- otherwise an illegal argument exception will be thrown for XT-->
- <xsl:with-param name="textToBeEncoded" select="@text:ref-name"/>
- </xsl:call-template>
- </xsl:attribute>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
- <xsl:template match="text:reference-mark">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- Java is needed as we have to encode the relative links (bug#102311) -->
- <xsl:if test="not($isJavaDisabled)">
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:call-template name="encode-string">
- <!-- the space has to be normalized,
- otherwise an illegal argument exception will be thrown for XT-->
- <xsl:with-param name="textToBeEncoded" select="@text:name"/>
- </xsl:call-template>
- </xsl:attribute>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
-
-
- <xsl:template match="text:reference-mark-start">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- Java is needed as we have to encode the relative links (bug#102311) -->
- <xsl:if test="not($isJavaDisabled)">
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:call-template name="encode-string">
- <!-- the space has to be normalized,
- otherwise an illegal argument exception will be thrown for XT-->
- <xsl:with-param name="textToBeEncoded" select="@text:name"/>
- </xsl:call-template>
- </xsl:attribute>
-
- <xsl:variable name="endOfReference">
- <xsl:for-each select="text:reference-mark-end[@name=current()/@text:name]">
- <xsl:value-of select="position()"/>
- </xsl:for-each>
- </xsl:variable>
-
- <xsl:for-each select="following-sibling::*[position() < $endOfReference]">
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:for-each>
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
-
-
-
- <!-- content table link -->
- <xsl:template match="text:a" mode="content-table">
- <xsl:param name="collectedGlobalData"/>
-
-
- <!-- For anchors in content-headers a bug exists (cp. bug id# 102311) and they have to be worked out separately.
- Currently the link used in the content-table of an Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
- is not a valid URL (cp. bug id# 102311). No file destination is specified nor exist any anchor element for these
- links in the Office XML, nor is the chapter no. known in the linked files.
- A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
- can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
- All header titles gonna be encoding to be usable in a relative URL. -->
- <xsl:choose>
- <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled">
- <xsl:call-template name="create-common-link">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="create-content-table-link">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="get-absolute-chapter-no">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="precedingChapterLevel1"/>
-
- <xsl:choose>
- <xsl:when test="$globalDocumentRefToCurrentFile">
-
- <xsl:variable name="currentFileHeadingNo">
- <xsl:call-template name="get-current-file-heading-no"/>
- </xsl:variable>
- <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
-
- <xsl:call-template name="get-global-heading-no">
- <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
- <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
- </xsl:call-template>
-
- </xsl:when>
- <xsl:otherwise>
- <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
- work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
- <xsl:variable name="currentFileHeadingNo">
- <xsl:call-template name="get-current-file-heading-no"/>
- </xsl:variable>
- <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
-
- <xsl:call-template name="get-global-heading-no">
- <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
- <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="get-current-file-heading-no">
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-current-child-heading-no')">
- <xsl:value-of select="sxghelper:get-current-child-heading-no()"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo()"/>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="get-next-current-file-heading-no">
- <xsl:param name="file"/>
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-next-current-child-heading-no')">
- <xsl:value-of select="sxghelper:get-next-current-child-heading-no($file)"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo($file)"/>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="get-global-heading-no">
- <xsl:param name="currentFileHeadingNo"/>
- <xsl:param name="precedingChapterLevel1"/>
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-global-heading-no')">
- <xsl:value-of select="sxghelper:get-global-heading-no(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
-
-
- <!-- necessary as anchor for the content table -->
- <xsl:template name="create-heading-anchor">
- <xsl:param name="collectedGlobalData"/>
-
- <!--
- Currently the link used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
- is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
- links in the Office XML.
- Here we are creating an anchor with the space normalized text of this header as potential jump address of the content table -->
-
- <xsl:choose>
- <xsl:when test="$globalDocumentRefToCurrentFile">
-
- <xsl:variable name="currentFileHeadingNo">
- <xsl:call-template name="get-next-current-file-heading-no">
- <xsl:with-param name="file" select="$globalDocumentRefToCurrentFile"/>
- </xsl:call-template>
- </xsl:variable>
-
-
- <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
- <xsl:if test="$isDebugMode">
- <xsl:message>Matching child document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
- <xsl:message>absolute-chapter-level: <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
- <xsl:message>encodedTitle: <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
- <xsl:message>globalDocumentRefToCurrentFile: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
- <xsl:message>*** </xsl:message>
- </xsl:if>
-
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:value-of select="$testResult/@absolute-chapter-level"/>
- <xsl:text>+</xsl:text>
- <xsl:value-of select="$testResult/@encoded-title"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
- work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
- <xsl:variable name="currentFileHeadingNo">
- <xsl:call-template name="get-next-current-file-heading-no">
- <xsl:with-param name="file" select="$contentTableURL"/>
- </xsl:call-template>
- </xsl:variable>
-
-
- <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
-
- <xsl:if test="$isDebugMode">
- <xsl:message>Matching global document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
- <xsl:message>absolute-chapter-level: <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
- <xsl:message>encodedTitle: <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
- <xsl:message>contentTableURL: <xsl:value-of select="$contentTableURL"/></xsl:message>
- <xsl:message>*** </xsl:message>
- </xsl:if>
-
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:value-of select="$testResult/@absolute-chapter-level"/>
- <xsl:text>+</xsl:text>
- <xsl:value-of select="$testResult/@encoded-title"/>
- </xsl:attribute>
- </xsl:element>
-
- </xsl:otherwise>
- </xsl:choose>
-
-
-
-<!--
-
- <xsl:variable name="title" select="normalize-space(.)"/>
- <!~~DON'T WORK <xsl:variable name="title" select="normalize-space(descendant::text())"/> ~~>
- <xsl:choose>
- <xsl:when test="$globalDocumentRefToCurrentFile">
- <xsl:variable name="testResults" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][$title = @title][current()/@text:level = @level]"/>
- <xsl:if test="1 < count($testResults)">
- <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
- <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
- </xsl:if>
-
- <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
- <xsl:choose>
- <xsl:when test="$encodedTitle">
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:value-of select="$encodedTitle"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <!~~ even when it is not ~~>
- <xsl:variable name="newEncodedTitle">
- <xsl:call-template name="encode-string">
- <!~~ the space has to be normalized,
- otherwise an illegal argument exception will be thrown for XT~~>
- <xsl:with-param name="textToBeEncoded" select="$title"/>
- </xsl:call-template>
- </xsl:variable>
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:value-of select="$newEncodedTitle"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:variable name="testResults" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][$title = @title][current()/@text:level = @level]"/>
- <xsl:if test="1 < count($testResults)">
- <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
- <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
- <xsl:message> *** </xsl:message>
- </xsl:if>
-
- <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
- <xsl:choose>
- <xsl:when test="$encodedTitle">
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:value-of select="$encodedTitle"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <!~~ even when it is not ~~>
- <xsl:variable name="newEncodedTitle">
- <xsl:call-template name="encode-string">
- <!~~ the space has to be normalized,
- otherwise an illegal argument exception will be thrown for XT~~>
- <xsl:with-param name="textToBeEncoded" select="$title"/>
- </xsl:call-template>
- </xsl:variable>
- <xsl:element name="a">
- <xsl:attribute name="name">
- <xsl:value-of select="$newEncodedTitle"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
-
--->
-
- </xsl:template>
-
-
-
-
- <!-- ************************************** -->
- <!-- CREATION OF A CONTENT TABLE LINK -->
- <!-- ************************************** -->
-
-
- <!-- a special behavior of text:a
- (called from the 'text:a' template) -->
-
- <xsl:template name="create-content-table-link">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <xsl:when test="not($outputType = 'WML')">
- <xsl:element name="a">
- <xsl:attribute name="href">
- <xsl:choose>
- <xsl:when test="starts-with(@xlink:href, '#')">
- <xsl:variable name="correctHeading" select="$collectedGlobalData/content-table-headings/heading[current()/@xlink:href = @content-table-id]"/>
-
- <xsl:value-of select="$correctHeading/@out-file-url"/>
- <xsl:text>#</xsl:text>
- <xsl:value-of select="$correctHeading/@absolute-chapter-level"/>
- <xsl:text>+</xsl:text>
- <xsl:value-of select="$correctHeading/@encoded-title"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="create-common-link">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
-
- <xsl:call-template name="apply-styles-and-content">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <!-- 2DO: currently no WML support
-
- <!~~ no nested p tags in wml1.1 allowed ~~>
- <xsl:choose>
- <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
- <xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- <xsl:apply-templates select="."/>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="p">
- <xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
- <xsl:apply-templates select="."/>
- </xsl:element>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose> -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!--
- CREATION OF A HELPER VARIABLE AS WORKAROUND FOR THE CONTENT TABLE ULR BUG
-
-
- As no valid URL from the content table to the child documents exist in the content table,
- a work-around is done:
-
- First two helper variables are being created.
-
- One containing the list of all references of the global document:
- containg all their title,
- for example:
-
- <chapter-ref title="aTitle 1"/>
- <chapter-ref title="aTitle 2"/>
- <chapter-ref title="aTitle 2/>
- <chapter-ref title="aTitle 3/>
-
- The other containing all heading from the child documents linked from the global document.
- The variable 'childrenHeadings' contains their title and the number of preceding similar titles,
- for example:
-
-
- <child file-url="aURL">
- <heading title="aTitle1" level="1">
- <heading title="aTitle2" level="2">
- <heading title="aTitle3" level="1">
- </child>
-
- For each chapter reference from the content table the
-
- by encoding the chapter names of the child document with the java URLEncoder and
- use this as a part of a link. Furthermore for all heading elements a encoded anchor will be created from the heading.
- Last the workaround parses all children documents for this anhor, as there is no distinction of files from the content table entries.
-
- The new added node set to the collectedGlobalData variable concering the content table is written as
-
-
- <content-table-headings content-table-url="aURL_ToTheGeneratedContentTable">
- <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
- <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
- <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
- <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
- </content-table-headings>
-
-
- Preconditions:
- The correct sequence of child documents according to the Content Table is necessary, granted by the office.
- -->
- <xsl:template name="Create-helper-variables-for-Content-Table">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the content table....</xsl:message></xsl:if>
-
- <!-- Here a helper variable of the content table is created, of all chapter-references which point to a child document.
- an 'chapter-ref' element will be created, containg their title and the number of preceding similar titles,
- for example:
-
- <chapter-ref title="aTitle 1"/>
- <chapter-ref title="aTitle 2"/>
- <chapter-ref title="aTitle 2"/>
- <chapter-ref title="aTitle 3"/>
- -->
- <xsl:variable name="chapterRefs-RTF">
- <!-- '/*/' as the flat and the zipped XML file format have different root elements -->
- <xsl:for-each select="/*/office:body/text:table-of-content/text:index-body/text:p/text:a">
- <xsl:variable name="currentTitle" select="normalize-space(string(.))"/>
- <xsl:element name="chapter-ref">
- <xsl:attribute name="title">
- <xsl:value-of select="$currentTitle"/>
- </xsl:attribute>
- <xsl:attribute name="content-table-id">
- <xsl:value-of select="@xlink:href"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:for-each>
- </xsl:variable>
- <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the content table!</xsl:message></xsl:if>
-
-
-
-
- <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the child documents....</xsl:message></xsl:if>
- <!-- Here a helper variable of created from the children documents.
- Containg all heading elements from the child documents. Some or all of them are
- chapters referenced by the Global Document.
- The variable contains their title, the level of the heading and the file URL of the child,
- for example:
-
- <heading title="aTitle1" level="1" file-url="aURL1">
- <heading title="aTitle2" level="2" file-url="aURL1">
- <heading title="aTitle3" level="1" file-url="aURL1">
- <heading title="aTitle4" level="1" file-url="aURL2">
- <heading title="aTitle5" level="2" file-url="aURL2">
- <heading title="aTitle2" level="3" file-url="aURL2">
- <heading title="aTitle6" level="3" file-url="aURL2">
- <heading-count>7</heading-count>
- -->
- <xsl:variable name="childrenHeadings-RTF">
- <!-- all headers from children documents will be added -->
- <xsl:apply-templates select="/*/office:body/text:section" mode="creation-of-variable"/>
- </xsl:variable>
- <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the child documents!</xsl:message></xsl:if>
-
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:call-template name="Create-global-variable-for-Content-Table">
- <xsl:with-param name="chapterRefs" select="xt:node-set($chapterRefs-RTF)"/>
- <xsl:with-param name="childrenHeadings" select="xt:node-set($childrenHeadings-RTF)"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:call-template name="Create-global-variable-for-Content-Table">
- <xsl:with-param name="chapterRefs" select="xalan:nodeset($chapterRefs-RTF)"/>
- <xsl:with-param name="childrenHeadings" select="xalan:nodeset($childrenHeadings-RTF)"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
-
-
- <xsl:template name="Create-global-variable-for-Content-Table">
- <xsl:param name="chapterRefs"/>
- <xsl:param name="childrenHeadings"/>
- <xsl:param name="collectedGlobalData"/>
-
-
- <xsl:if test="$isDebugMode">
- <!-- helper variable collecting all headings from the global document file children-->
- <xsl:for-each select="$childrenHeadings/heading">
- <xsl:message># <xsl:value-of select="position()"/></xsl:message>
- <xsl:message>level: <xsl:value-of select="@level"/></xsl:message>
- <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
- <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
- <xsl:message>file-url: <xsl:value-of select="@file-url"/></xsl:message>
- <xsl:message>header-no: <xsl:value-of select="@header-no"/></xsl:message>
- <xsl:message>**</xsl:message>
- </xsl:for-each>
- <xsl:message>**</xsl:message>
- <xsl:message>**</xsl:message>
-
- <!-- helper variable collecting all heading references from the content table of the the global document -->
- <xsl:message>childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
- <xsl:for-each select="$chapterRefs/chapter-ref">
- <xsl:message># <xsl:value-of select="position()"/></xsl:message>
- <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
- <xsl:message>**</xsl:message>
- </xsl:for-each>
- </xsl:if>
-
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:set-heading-no')">
- <xsl:value-of select="sxghelper:set-heading-no(1)"/>
- <xsl:value-of select="sxghelper:set-current-child-no(1)"/>
- <xsl:value-of select="sxghelper:set-current-child-url(string($childrenHeadings/heading/@file-url))"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo(1)"/>
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo(1)"/>
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl(string($childrenHeadings/heading/@file-ur))"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$isDebugMode"><xsl:message>Creating global document variable for chapter relations....</xsl:message></xsl:if>
- <xsl:variable name="contentTableHeadingsGlobalData-RTF">
- <xsl:element name="content-table-headings">
- <!-- all headings are linked from the current global document input file -->
- <xsl:attribute name="content-table-url">
- <xsl:value-of select="$contentTableURL"/>
- </xsl:attribute>
-
- <!-- had to use a for loop, as a recursion ends with an stackoverflow exception after about 600 recursive calls -->
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-heading-no')">
- <xsl:for-each select="$chapterRefs/chapter-ref">
- <xsl:call-template name="searchHeadingInChildDocument">
- <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
- <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
- <xsl:with-param name="currentChapterRefNo" select="position()"/>
- <xsl:with-param name="currentHeadingNo" select="sxghelper:get-heading-no()"/>
- <xsl:with-param name="currentChildURL" select="sxghelper:get-current-child-url()"/>
- <xsl:with-param name="currentChildNo" select="sxghelper:get-current-child-no()"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo')">
- <xsl:for-each select="$chapterRefs/chapter-ref">
- <xsl:call-template name="searchHeadingInChildDocument">
- <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
- <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
- <xsl:with-param name="currentChapterRefNo" select="position()"/>
- <xsl:with-param name="currentHeadingNo" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo()"/>
- <xsl:with-param name="currentChildURL" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildUrl()"/>
- <xsl:with-param name="currentChildNo" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildNo()"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:when>
- </xsl:choose>
- </xsl:element>
-
- <!-- adding the already exisiting global data environment -->
- <xsl:copy-of select="$collectedGlobalData"/>
- </xsl:variable>
- <xsl:if test="$isDebugMode"><xsl:message>Finished global document variable for chapter relations!</xsl:message></xsl:if>
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:call-template name="start-self-and-children-transformation">
- <xsl:with-param name="collectedGlobalData" select="xt:node-set($contentTableHeadingsGlobalData-RTF)"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:call-template name="start-self-and-children-transformation">
- <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($contentTableHeadingsGlobalData-RTF)"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="searchHeadingInChildDocument">
- <xsl:param name="chapterRefs"/>
- <xsl:param name="childrenHeadings"/>
- <xsl:param name="currentChapterRefNo"/>
- <xsl:param name="currentHeadingNo"/>
- <xsl:param name="currentChildURL"/>
- <xsl:param name="currentChildNo"/>
-
-
- <xsl:variable name="currentChapterRef" select="$chapterRefs/chapter-ref[$currentChapterRefNo]"/>
- <xsl:variable name="currentChapterID" select="$currentChapterRef/@content-table-id"/>
- <xsl:variable name="currentChapterTitle" select="$currentChapterRef/@title"/>
-
- <xsl:variable name="currentChildHeading" select="$childrenHeadings/heading[$currentHeadingNo]"/>
- <xsl:variable name="headingTitle" select="$currentChildHeading/@title"/>
- <xsl:variable name="headingLevel" select="$currentChildHeading/@level"/>
- <xsl:variable name="headingNo" select="$currentChildHeading/@header-no"/>
- <xsl:variable name="newChildURL" select="$currentChildHeading/@file-url"/>
-
- <xsl:if test="$isDebugMode">
- <xsl:message>*** new heading </xsl:message>
- <xsl:message>currentChapterID: <xsl:value-of select="$currentChapterID"/></xsl:message>
- <xsl:message>currentChapterTitle: <xsl:value-of select="$currentChapterTitle"/></xsl:message>
- <xsl:message>currentChapterID: <xsl:value-of select="$currentChapterID"/></xsl:message>
- <xsl:message>currentHeadingNo: <xsl:value-of select="$currentHeadingNo"/></xsl:message>
- <xsl:message>headingTitle: <xsl:value-of select="$headingTitle"/></xsl:message>
- <xsl:message>headingLevel: <xsl:value-of select="$headingLevel"/></xsl:message>
- <xsl:message>headingNo: <xsl:value-of select="$headingNo"/></xsl:message>
- <xsl:message>newChildURL: <xsl:value-of select="$newChildURL"/></xsl:message>
- </xsl:if>
-
- <xsl:variable name="outFileURL">
- <xsl:choose>
- <xsl:when test="substring-before($newChildURL,'.xml')">
- <xsl:value-of select="concat(substring-before($newChildURL,'.xml'),'.htm')"/>
- </xsl:when>
- <xsl:when test="substring-before($newChildURL,'.sx')">
- <xsl:value-of select="concat(substring-before($newChildURL,'.sx'),'.htm')"/>
- </xsl:when>
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="isChapterHeading" select="$headingTitle = $currentChapterTitle"/>
- <xsl:variable name="isNewFile" select="string($newChildURL) != string($currentChildURL)"/>
-
-
-
-
- <xsl:if test="$isNewFile">
- <!-- reset of the already collected child headers -->
- <xsl:call-template name="calc-chapter-numbers">
- <xsl:with-param name="level" select="0"/>
- </xsl:call-template>
- </xsl:if>
- <xsl:variable name="absoluteChapterLevel">
- <xsl:call-template name="calc-chapter-numbers">
- <xsl:with-param name="level" select="number($headingLevel)"/>
- </xsl:call-template>
- </xsl:variable>
-
-
- <xsl:element name="heading">
- <!-- necessary to as ID from the content table to get the correct heading element (the buggy URL used as ID)-->
- <xsl:attribute name="content-table-id">
- <xsl:choose>
- <xsl:when test="$isChapterHeading">
- <xsl:value-of select="$currentChapterID"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>only a heading, but not a chapter</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <!-- no of the used child, necessary for quick finding of chapters of next file -->
- <xsl:attribute name="child-document-no">
- <xsl:choose>
- <xsl:when test="$isNewFile">
- <xsl:value-of select="$currentChildNo + 1"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$currentChildNo"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <!-- the URL of the child document source, containing the heading -->
- <xsl:attribute name="file-url">
- <xsl:value-of select="$newChildURL"/>
- </xsl:attribute>
- <xsl:attribute name="out-file-url">
- <xsl:value-of select="$outFileURL"/>
- </xsl:attribute>
- <xsl:attribute name="level">
- <xsl:value-of select="$headingLevel"/>
- </xsl:attribute>
- <xsl:attribute name="title">
- <xsl:value-of select="$headingTitle"/>
- </xsl:attribute>
- <xsl:attribute name="encoded-title">
- <xsl:value-of select="$currentChildHeading/@encoded-title"/>
- </xsl:attribute>
- <xsl:attribute name="absolute-chapter-level">
- <xsl:value-of select="$absoluteChapterLevel"/>
- </xsl:attribute>
- </xsl:element>
-
-
- <xsl:choose>
- <xsl:when test="$childrenHeadings/heading-count != $currentHeadingNo">
- <!-- procede as long the list of children isn'nt worked through -->
- <xsl:choose>
- <xsl:when test="$isChapterHeading">
- <!-- global variables have to be set, so the for-each loop can access them -->
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:set-heading-no')">
- <xsl:value-of select="sxghelper:set-heading-no($currentHeadingNo + 1)"/>
- <xsl:if test="$isNewFile">
- <xsl:value-of select="sxghelper:set-current-child-no($currentChildNo + 1)"/>
- <xsl:value-of select="sxghelper:set-current-child-url(string($newChildURL))"/>
- </xsl:if>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo($currentHeadingNo + 1)"/>
- <xsl:if test="$isNewFile">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo($currentChildNo + 1)"/>
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl($newChildURL)"/>
- </xsl:if>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <!-- not a chapter heading, call itself until a chapter ref is found or the end of headings is reached -->
- <xsl:call-template name="searchHeadingInChildDocument">
- <xsl:with-param name="chapterRefs" select="$chapterRefs"/>
- <xsl:with-param name="childrenHeadings" select="$childrenHeadings"/>
- <xsl:with-param name="currentChapterRefNo" select="$currentChapterRefNo"/>
- <xsl:with-param name="currentHeadingNo" select="$currentHeadingNo + 1"/>
- <xsl:with-param name="currentChildURL" select="$currentChildURL"/>
- <xsl:with-param name="currentChildNo" select="$currentChildNo"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:if test="$isDebugMode">
- <xsl:message>All child documents have been walked through without finding the chapter name!</xsl:message>
- <xsl:message> childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
- <xsl:message> currentHeadingNo: <xsl:value-of select="$currentHeadingNo"/></xsl:message>
- </xsl:if>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
-
-
- <!-- Chapters from the Content Table have currently no anchor to child documents in OOo XML.
- As solution, whenever a a global document every header of the HTML output gets get's an anchor in the Therefore-->
- <xsl:template name="encode-string">
- <xsl:param name="encoding" select="'UTF-8'"/>
- <xsl:param name="textToBeEncoded"/>
-
- <xsl:choose>
- <xsl:when test="function-available('urlencoder:encode')">
- <xsl:value-of select="urlencoder:encode(normalize-space($textToBeEncoded),$encoding)"/>
- </xsl:when>
- <xsl:when test="function-available('java:java.net.URLEncoder.encode')">
- <xsl:value-of select="java:java.net.URLEncoder.encode(string(normalize-space($textToBeEncoded)),string($encoding))"/>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
-
-
-
- <!-- ******************************************************************************************************** -->
- <!-- *** TRANSFORMATION OF ALL CHILD DOCUMENTS OF THE GLOBAL DOCUMENTS BY USING A EXTERNAL HELPER CLASS *** -->
- <!-- ******************************************************************************************************** -->
-
-
- <!-- a new element 'contentTableHeadings' will be added to the helper variable the first time a child will be transformed -->
- <xsl:template name="transform-global-document-and-children">
- <xsl:param name="collectedGlobalData"/>
-
-
- <xsl:choose>
- <xsl:when test="$collectedGlobalData/content-table-headings">
- <xsl:call-template name="start-child-transformation">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <!-- The necessary auxiliary variable hasn't build yet.
- This variable gonna store all headers (with chapter numbers) and the URL of their files -->
-
- <xsl:call-template name="Create-helper-variables-for-Content-Table">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
-
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="start-self-and-children-transformation">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:if test="$isDebugMode">
- <xsl:call-template name="debug-content-table-headings-variable">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
-
- <xsl:message>Parsing the global document...</xsl:message>
- </xsl:if>
-
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
-
- <xsl:if test="$isDebugMode"><xsl:message>Parsing the child documents...</xsl:message></xsl:if>
- <xsl:call-template name="start-child-transformation">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
-
- </xsl:template>
-
-
-
-
- <xsl:template name="start-child-transformation">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:if test="$isDebugMode"><xsl:message>Starting the child transformations...</xsl:message></xsl:if>
-
- <!-- As the childs of a global document (with suffix .sxg) do not know anything about their global parent,
- the transformation of global documents children have to be done implizit.
- Otherwise the chapter number of the children will always start with zero, as they do not know anything about the
- proceding chapters.
- Furthermore, they don't have any links about preceeding and following documents and no linking for usability reasons
- could be done. Therefore the children have to be transformed during the transformation of a global (sxg) document -->
- <xsl:if test="$isDebugMode">
- <xsl:choose>
- <xsl:when test="$collectedGlobalData/content-table-headings">
- <xsl:message>Contentable data exists as global data!</xsl:message>
- </xsl:when>
- <xsl:otherwise>
- <xsl:message>No Contentable global data exists!</xsl:message>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:if>
-
- <!-- currently this function only works with node-sets from XT -->
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:transform-children')">
- <xsl:message>
- <xsl:value-of select="sxghelper:transform-children( $collectedGlobalData/content-table-headings,
- string($jaredRootURL),
- string($absoluteSourceDirRef),
- string($optionalURLSuffix),
- string($dpi),
- string($outputType),
- $isDebugMode)"/>
- </xsl:message>
- </xsl:when>
- <xsl:otherwise>
- <xsl:message>Java method transformChildren to transform all children of a global document could not be found. Be sure to use the XT processor.</xsl:message>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
-
-
- <!-- ******************************************************************************* -->
- <!-- *** Creation of helper variable of the headings of all children documents *** -->
- <!-- ******************************************************************************* -->
-
-
- <xsl:template match="/*/office:body/text:section" mode="creation-of-variable">
- <xsl:call-template name="getChildRootNode"/>
-
- <!-- after the last child document the global document will be parsed -->
- <xsl:if test="position() = last()">
- <!-- search the global document after all child documents have been searched
-
-ODK PATCH NO INDEX ELEMENT WANTED !! - null pointer exception
- <xsl:call-template name="getPreviousHeaderNo">
- <xsl:with-param name="fileURL" select="$contentTableURL"/>
- <xsl:with-param name="amountOfCurrentHeading" select="count(following-sibling::text:h)"/>
- <xsl:with-param name="nodeToSearchForHeading" select="following-sibling::text:h"/>
- </xsl:call-template>
--->
- <!-- get the overall No of Headers -->
- <xsl:call-template name="getAllHeaderNo"/>
- </xsl:if>
- </xsl:template>
-
-
- <xsl:template name="getChildRootNode">
- <xsl:variable name="fileURL" select="text:section-source/@xlink:href"/>
-
- <xsl:choose>
- <!-- if absolute URL or absolute DOS PATH or absolute Unix path -->
- <xsl:when test="contains($fileURL,'//') or (substring($fileURL,2,1) = ':') or starts-with($fileURL, '/')">
- <xsl:variable name="childRootNode" select="document($fileURL)"/>
- <xsl:call-template name="getPreviousHeaderNo">
- <xsl:with-param name="fileURL" select="$fileURL"/>
- <!-- NO absolute source path will be added as prefix -->
- <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
- <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:variable name="childRootNode" select="document(concat($absoluteSourceDirRef,'/',$fileURL))"/>
- <xsl:call-template name="getPreviousHeaderNo">
- <xsl:with-param name="fileURL" select="$fileURL"/>
- <!-- the absolute source path will be added as prefix -->
- <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
- <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <xsl:template name="getPreviousHeaderNo">
- <xsl:param name="fileURL"/>
- <xsl:param name="nodeToSearchForHeading"/>
- <xsl:param name="amountOfCurrentHeading"/>
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-previous-child-documents-heading-count')">
- <xsl:call-template name="addHeadingInfo">
- <xsl:with-param name="nodeToSearchForHeading" select="$nodeToSearchForHeading"/>
- <xsl:with-param name="fileURL" select="$fileURL"/>
- <xsl:with-param name="previousHeader" select="sxghelper:get-previous-child-documents-heading-count($amountOfCurrentHeading)"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount')">
- <xsl:call-template name="addHeadingInfo">
- <xsl:with-param name="nodeToSearchForHeading" select="$nodeToSearchForHeading"/>
- <xsl:with-param name="fileURL" select="$fileURL"/>
- <xsl:with-param name="previousHeader" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount($amountOfCurrentHeading)"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
-
- </xsl:template>
-
-
- <xsl:template name="addHeadingInfo">
- <xsl:param name="fileURL"/>
- <xsl:param name="previousHeader"/>
- <xsl:param name="nodeToSearchForHeading"/>
-
- <xsl:variable name="previousHeader2" select="number($previousHeader)"/>
- <xsl:for-each select="$nodeToSearchForHeading">
-
- <xsl:variable name="title" select="normalize-space(.)"/>
-
- <xsl:variable name="encodedTitle">
- <xsl:call-template name="encode-string">
- <!-- the space has to be normalized,
- otherwise an illegal argument exception will be thrown for XT-->
- <xsl:with-param name="textToBeEncoded" select="$title"/>
- </xsl:call-template>
- </xsl:variable>
-
- <xsl:element name="heading">
- <!-- odd but 'descendant:text()' didn't work, but '.', to get all text nodes of the header -->
- <xsl:attribute name="title"><xsl:value-of select="$title"/></xsl:attribute>
- <xsl:attribute name="encoded-title"><xsl:value-of select="$encodedTitle"/></xsl:attribute>
- <xsl:attribute name="level"><xsl:value-of select="@text:level"/></xsl:attribute>
- <xsl:attribute name="file-url"><xsl:value-of select="$fileURL"/></xsl:attribute>
- <xsl:attribute name="header-no"><xsl:value-of select="position() + $previousHeader2"/></xsl:attribute>
- </xsl:element>
- </xsl:for-each>
-
- </xsl:template>
-
-
- <xsl:template name="getAllHeaderNo">
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-all-child-documents-heading-count')">
- <xsl:call-template name="addAllHeaderNoElement">
- <xsl:with-param name="allHeader" select="sxghelper:get-all-child-documents-heading-count()"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount')">
- <xsl:call-template name="addAllHeaderNoElement">
- <xsl:with-param name="allHeader" select="java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount()"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name="addAllHeaderNoElement">
- <xsl:param name="allHeader"/>
-
- <xsl:element name="heading-count">
- <xsl:value-of select="$allHeader"/>
- </xsl:element>
-
- </xsl:template>
-
-
- <!-- ******************************************************************************************************* -->
- <!-- *** Creation of a line of links at the beginning and end of a child document to enhance usability *** -->
- <!-- ******************************************************************************************************* -->
-
- <xsl:template name="add-child-document-usability-links">
- <xsl:element name="center">
- <xsl:element name="small">
- <xsl:text>[ </xsl:text>
-
-
- <xsl:variable name="globalDocumentDir" select="sxghelper:get-global-document-dir()"/>
- <xsl:variable name="currentChildNo" select="number($contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url]/@child-document-no)"/>
- <xsl:variable name="earlierDocURL" select="$contentTableHeadings/heading[($currentChildNo - 1) = @child-document-no]/@out-file-url"/>
-<!--
-<xsl:message>from: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
-<xsl:message>to: <xsl:value-of select="$earlierDocURL"/></xsl:message>
-<xsl:message>Is: <xsl:call-template name="get-relative-file-ref">
- <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
- <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
- </xsl:call-template>
-</xsl:message>-->
-
-
- <xsl:if test="$earlierDocURL">
- <xsl:element name="a">
- <xsl:attribute name="href">
- <!-- when the links starts with a '#' it's a link to the Content Table-->
- <xsl:choose>
- <xsl:when test="starts-with($earlierDocURL, '#')">
-
- <xsl:call-template name="get-relative-file-ref">
- <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
- <xsl:with-param name="targetFileRef" select="."/>
- </xsl:call-template>
-<!-- <xsl:value-of select="concat($contentTableURL, $earlierDocURL)"/>-->
- </xsl:when>
- <xsl:otherwise>
-
- <xsl:call-template name="get-relative-file-ref">
- <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
- <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
- </xsl:call-template>
-<!--
-
- <xsl:value-of select="concat($globalDocumentDir, $earlierDocURL)"/>-->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:text>Previous document</xsl:text>
- </xsl:element>
-
- <xsl:text> | </xsl:text>
- </xsl:if>
-
- <xsl:element name="a">
- <xsl:attribute name="href">
- <!-- when globalDocumentRefToCurrentFile is unset the current file is the Content Table-->
- <xsl:choose>
- <xsl:when test="$globalDocumentRefToCurrentFile">
- <xsl:variable name="contentTableDir">
- <xsl:call-template name="get-name-of-table-of-content-document"/>
- </xsl:variable>
-
- <xsl:call-template name="get-relative-file-ref">
- <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
- <xsl:with-param name="targetFileRef" select="$contentTableDir"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>#</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
-
-<!-- <xsl:value-of select="$contentTableURL"/>-->
- </xsl:attribute>
- <xsl:text>Content Table</xsl:text>
- </xsl:element>
-
-
- <xsl:variable name="nextDocURL" select="$contentTableHeadings/heading[($currentChildNo + 1) = @child-document-no]/@out-file-url"/>
- <xsl:if test="$nextDocURL">
- <xsl:text> | </xsl:text>
- <xsl:element name="a">
- <xsl:attribute name="href">
- <!-- when the links starts with a '#' it's a link to the Content Table-->
- <xsl:choose>
- <xsl:when test="starts-with($nextDocURL, '#')">
- <xsl:call-template name="get-relative-file-ref">
- <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
- <xsl:with-param name="targetFileRef" select="."/>
- </xsl:call-template>
-<!-- <xsl:value-of select="concat($contentTableURL, $nextDocURL)"/>-->
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="get-relative-file-ref">
- <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
- <xsl:with-param name="targetFileRef" select="$nextDocURL"/>
- </xsl:call-template>
-<!-- <xsl:value-of select="concat($globalDocumentDir, $nextDocURL)"/>-->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:text>Next document</xsl:text>
- </xsl:element>
- </xsl:if>
- <xsl:text> ]</xsl:text>
- </xsl:element>
- </xsl:element>
- </xsl:template>
-
-
- <xsl:template name="get-relative-file-ref">
- <xsl:param name="sourceFileRef"/>
- <xsl:param name="targetFileRef"/>
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-relative-file-ref')">
- <xsl:value-of select="sxghelper:get-relative-file-ref(string($sourceFileRef), string($targetFileRef))"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef(string($sourceFileRef), string($targetFileRef))"/>
- </xsl:when>
- </xsl:choose>
-
- </xsl:template>
-
-
- <xsl:template name="get-name-of-table-of-content-document">
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:get-name-of-table-of-content-document')">
- <xsl:value-of select="sxghelper:get-name-of-table-of-content-document()"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument()"/>
- </xsl:when>
- </xsl:choose>
-
- </xsl:template>
-
-
- <xsl:template name="debug-content-table-headings-variable">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:message><xsl:text>**** THE HEADING VARIABLE **** </xsl:text></xsl:message>
- <xsl:message>content-table-url: <xsl:value-of select="collectedGlobalData/content-table-headings/content-table-url"/></xsl:message>
-
- <xsl:for-each select="$collectedGlobalData/content-table-headings/heading">
- <xsl:message><xsl:text>**** new heading: </xsl:text></xsl:message>
- <xsl:message>content-table-id: <xsl:value-of select="@content-table-id"/></xsl:message>
- <xsl:message>child-document-no: <xsl:value-of select="@child-document-no"/></xsl:message>
- <xsl:message>file-url: <xsl:value-of select="@file-url"/></xsl:message>
- <xsl:message>out-file-url: <xsl:value-of select="@out-file-url"/></xsl:message>
- <xsl:message>level: <xsl:value-of select="@level"/></xsl:message>
- <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
- <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
- <xsl:message>absolute-chapter-level:<xsl:value-of select="@absolute-chapter-level"/></xsl:message>
- </xsl:for-each>
-
- </xsl:template>
-
-
- <!-- To make the headings unique, the absolute heading is added to them
- E.g. The level 1.2.3.4. would result into a 1+2+3+4 string -->
- <xsl:template name="calc-chapter-numbers">
- <xsl:param name="level"/>
-
- <xsl:choose>
- <xsl:when test="function-available('sxghelper:calc-chapter-numbers')">
- <xsl:value-of select="sxghelper:calc-chapter-numbers($level)"/>
- </xsl:when>
- <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers')">
- <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers($level)"/>
- </xsl:when>
- </xsl:choose>
-
- </xsl:template>
-
-
-
-
- <xsl:template match="text:p" mode="content-table">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:variable name="allTabStopStyles" select="$office:automatic-styles/style:style[@style:name = current()/@text:style-name]/style:properties/style:tab-stops"/>
-
- <xsl:element name="table">
- <xsl:attribute name="border">0</xsl:attribute>
- <xsl:attribute name="class"><xsl:value-of select="@text:style-name"/></xsl:attribute>
-<!--
-<xsl:message>*********</xsl:message>
-<xsl:message>Stylename:<xsl:value-of select="@text:style-name"/></xsl:message>
-<xsl:message>position: <xsl:value-of select="count($allTabStopStyles/style:tab-stop)"/></xsl:message>
--->
-
- <xsl:element name="colgroup">
- <xsl:call-template name="create-col-element">
- <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:element>
-
-
- <!-- all elements before the first tabStop -->
- <xsl:variable name="testNo-RTF">
- <xsl:apply-templates select="node()" mode="cell-content"/>
- </xsl:variable>
-
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
- <xsl:element name="tr">
- <xsl:call-template name="create-td-elements">
- <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
- <xsl:with-param name="position" select="1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
-
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:variable name="tabNodePositions" select="xalan:nodeset($testNo-RTF)"/>
- <xsl:element name="tr">
- <xsl:call-template name="create-td-elements">
- <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
- <xsl:with-param name="position" select="1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
-
- </xsl:when>
- </xsl:choose>
-
- <!-- <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
-
- <xsl:element name="tr">
- <xsl:call-template name="create-td-elements">
- <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
- <xsl:with-param name="position" select="1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>-->
-
-
- </xsl:element>
- </xsl:template>
-
-
- <xsl:template name="create-col-element">
- <xsl:param name="lastNodePosition"/>
- <xsl:param name="allTabStopStyles"/>
-
- <xsl:for-each select="$allTabStopStyles/style:tab-stop">
- <xsl:element name="col">
- <xsl:attribute name="style">
- <xsl:text>width: </xsl:text>
- <xsl:call-template name="grap-cell-width">
- <xsl:with-param name="position" select="position()"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:attribute>
- </xsl:element>
- </xsl:for-each>
-
- </xsl:template>
-<!--
-Scenarios tabstops
-
-1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
- -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.
-
-2) style:type is 'right' and earlier tabStop is right
- -> following text-nodes, will be put into a right aligned TD
-
-3) style:type is 'non-right' and earlier tabStop 'non-right' as well
- -> put the preceding tab stops into a TD (left aligned is default)
-
-4) first style:type would have no right precedign tabStop
- -> works well with first sceanrios 1 and 3
-
-5) last style:type would be a special case, if it would be left aligned, but this won't happen in our case.. :D
-
-Scenarios unmatched:
-- text:styleposition 'center' will not be matched in our case (effort for nothing), there will be only 'right' and not 'right'
-- If the last tabStop is not from text:stylepostion 'right', the length of the last cell is undefined and a document length must be found.
- Not happens in our global document case. Also the algorithm below would have to be expanded (cp. scenario 5).
-
--->
- <xsl:template name="create-td-elements">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="lastNodePosition"/>
- <xsl:param name="position"/>
- <xsl:param name="allTabStopStyles"/>
- <xsl:param name="tabNodePositions"/>
-<!--
-<xsl:message>++++++++</xsl:message>
-<xsl:message>Position: <xsl:value-of select="$position"/></xsl:message>
-<xsl:message>lastNodePosition: <xsl:value-of select="$lastNodePosition"/></xsl:message>
--->
-
- <xsl:variable name="currentStyleType" select="$allTabStopStyles/style:tab-stop[$position]/@style:type"/>
- <xsl:variable name="earlierStyleType" select="$allTabStopStyles/style:tab-stop[$position - 1]/@style:type"/>
- <xsl:choose>
- <xsl:when test="$currentStyleType = 'right'">
- <xsl:choose>
- <xsl:when test="$earlierStyleType = 'right'">
- <!--
- 2) style:type is 'right' and earlier tabStop is right
- -> following text-nodes, will be put into a right aligned TD -->
- <xsl:element name="td">
- <xsl:attribute name="style">
- <xsl:text>align: right</xsl:text>
- </xsl:attribute>
- <xsl:call-template name="grap-cell-content-before-tab-stop">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <!--
- 1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
- -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.-->
-<!-- valid HTML but browsers make a line break (border=0 and paragraphstyle also missing):
- <xsl:element name="table">
- <xsl:element name="td">
- <xsl:call-template name="grap-cell-content-before-tab-stop">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="endingTabStopPosition" select="$position"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
- </xsl:element>
- <xsl:element name="td">
- <xsl:attribute name="style">
- <xsl:text>align: right</xsl:text>
- </xsl:attribute>
- <xsl:call-template name="grap-cell-content-before-tab-stop">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:element>
--->
- <xsl:element name="td">
- <xsl:call-template name="grap-cell-content-before-tab-stop">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="endingTabStopPosition" select="$position"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
-<!-- ODK FEATURE NO PAGES
- <xsl:element name="td">
- <xsl:attribute name="style">
- <xsl:text>align: right</xsl:text>
- </xsl:attribute>
- <xsl:call-template name="grap-cell-content-before-tab-stop">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="endingTabStopPosition" select="$position + 1"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
- </xsl:element> -->
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:choose>
- <xsl:when test="$earlierStyleType = 'right'">
- </xsl:when>
- <xsl:otherwise>
- <!--
- 3) style:type is 'non-right' and earlier tabStop 'non-right' as well
- -> put the preceding tab stops into a TD (left aligned is default) -->
- <xsl:element name="td">
- <xsl:call-template name="grap-cell-content-before-tab-stop">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="endingTabStopPosition" select="$position"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:if test="$position != $lastNodePosition">
- <xsl:call-template name="create-td-elements">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
- <xsl:with-param name="position" select="$position + 1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
- </xsl:call-template>
- </xsl:if>
- </xsl:template>
-
-
- <xsl:template name="grap-cell-content-before-tab-stop">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="endingTabStopPosition"/>
- <xsl:param name="tabNodePositions"/>
- <xsl:param name="lastNodePosition"/>
-
- <xsl:choose>
- <xsl:when test="$endingTabStopPosition = 1">
- <xsl:apply-templates mode="content-table" select="node()[position() < $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]]">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:when>
- <xsl:when test="$endingTabStopPosition > $lastNodePosition">
- <xsl:apply-templates mode="content-table" select="node()[position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates mode="content-table" select="node()[position() < $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]][position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template mode="content-table" match="text:s">
- <xsl:call-template name="write-breakable-whitespace">
- <xsl:with-param name="whitespaces" select="@text:c"/>
- </xsl:call-template>
- </xsl:template>
-
-
- <xsl:template match="*" mode="cell-content">
-
- <xsl:if test="name() = 'text:tab-stop' or *[name() = 'text:tab-stop']">
- <xsl:element name="tab-stop-node-position">
- <xsl:value-of select="position()"/>
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
-
- <xsl:template name="grap-cell-width">
- <xsl:param name="position"/>
- <xsl:param name="allTabStopStyles"/>
-
- <xsl:variable name="tabStopPosition" select="$allTabStopStyles/style:tab-stop[$position]/@style:position"/>
- <xsl:choose>
- <xsl:when test="contains($tabStopPosition, 'cm')">
- <xsl:call-template name="create-cell-width">
- <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'cm'))"/>
- <xsl:with-param name="unit" select="'cm'"/>
- <xsl:with-param name="position" select="$position - 1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="contains($tabStopPosition, 'in')">
- <xsl:call-template name="create-cell-width">
- <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'in'))"/>
- <xsl:with-param name="unit" select="'in'"/>
- <xsl:with-param name="position" select="$position - 1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="contains($tabStopPosition, 'ch')">
- <xsl:call-template name="create-cell-width">
- <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'ch'))"/>
- <xsl:with-param name="unit" select="'ch'"/>
- <xsl:with-param name="position" select="$position - 1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="contains($tabStopPosition, 'pt')">
- <xsl:call-template name="create-cell-width">
- <xsl:with-param name="width" select="number(substring-before($tabStopPosition,'pt'))"/>
- <xsl:with-param name="unit" select="'pt'"/>
- <xsl:with-param name="position" select="$position - 1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name="create-cell-width">
- <xsl:param name="width"/>
- <xsl:param name="unit"/>
- <xsl:param name="position"/>
- <xsl:param name="allTabStopStyles"/>
-
- <xsl:choose>
- <xsl:when test="$position > 1">
- <xsl:call-template name="create-cell-width">
- <xsl:with-param name="width" select="$width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit))"/>
- <xsl:with-param name="unit" select="$unit"/>
- <xsl:with-param name="position" select="$position - 1"/>
- <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="$position = 1">
- <xsl:value-of select="concat($width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit)), $unit)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="concat($width, $unit)"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
- <xsl:output method ="xml"
- encoding ="UTF-8"
- indent ="yes"/>
-
-
-
- <!--+++++ INCLUDED XSL MODULES +++++-->
- <!-- inherited style properties will be collected and written in a CSS header (CSS) -->
- <xsl:include href="style_header.xsl"/>
-
- <!-- inherited style properties will be collected and written as html properties in a temporary variable (HTML4, PALM) -->
- <xsl:include href="style_inlined.xsl"/>
-
- <!-- our xml style properties will be mapped to CSS and HTML4.x properties -->
- <xsl:include href="style_mapping.xsl"/>
-
- <!-- common element handling -->
- <xsl:include href="common.xsl"/>
-
- <!-- table handling -->
- <xsl:include href="table.xsl"/>
-
- <!-- palm handling -->
- <xsl:include href="palm.xsl"/>
-
- <!-- global document handling -->
- <xsl:include href="global_document.xsl"/>
-
-
-
-
-
-
-
- <!--+++++ PARAMETER FROM THE APPLICATION AND GLOBAL VARIABLES +++++-->
-
- <!-- MANDATORY: URL of meta stream -->
- <xsl:param name="metaFileURL"/>
-
- <!-- MANDATORY: URL of styles stream -->
- <xsl:param name="stylesFileURL"/>
-
- <!-- MANDATORY: for resolving relative links
- For resolving realtive links to the packed SO document, i.e. the path/URL of the jared sxw file (e.g. meta.xml, styles.xml, links to graphics in a relative directory) -->
- <xsl:param name="absoluteSourceDirRef"/>
-
- <!-- OPTIONAL (mandatory, when when source is compressed): Necessary for the in the packed OO document embedded files (mostly graphics from the compressed /Picture dir).
- When the OpenOffice (OO) file has been unpacked the absoluteSoureDirRef can be taken,
- Otherwise, a JAR URL could be choosen or when working with OpenOffice a so called Package-URL encoded over HTTP can be used to
- access the jared contents of the the jared document. . -->
- <xsl:param name="jaredRootURL" select="$absoluteSourceDirRef"/>
-
- <!-- OPTIONAL (mandatory, when used in session based environment)
- Useful for WebApplications: if a HTTP session is not cookie based, URL rewriting is beeing used (the session is appended to the URL).
- This URL session is used when creating links to graphics by XSLT. Otherwise the user havt to log again in for every graphic he would like to see. -->
- <xsl:param name="optionalURLSuffix"/>
-
- <!-- OPTIONAL: DPI (dots per inch) the standard solution of given pictures (necessary for the conversion of 'cm' into 'pixel')-->
- <!-- Although many pictures have the 96 dpi resolution, a higher resoltion give better results for common browsers -->
- <xsl:param name="dpi" select="96"/>
-
- <!-- OPTIONAL: in case of using a different processor than a JAVA XSLT, you can unable the Java functionality
- (i.e. debugging time and encoding chapter names for the content-table as href and anchors ) -->
- <xsl:param name="disableJava" select="false"/>
- <xsl:param name="isJavaDisabled" select="boolean($disableJava)"/>
-
- <!-- OPTIONAL: user-agent will be differntiated by this parameter given by application (e.g. java servlet)-->
- <xsl:param name="outputType" select="'CSS_HEADER'"/>
- <!-- set of possible deviceTyps (WML is set in its own startfile main_wml.xsl):
- <xsl:param name="outputType" select="'CSS_HEADER'"/>
- <xsl:param name="outputType" select="'CSS_INLINED'"/>
- <xsl:param name="outputType" select="'PALM'"/> -->
-
- <!-- OPTIONAL: for activating the debug mode set the variable here to 'true()' or give any value from outside -->
- <xsl:param name="debug" select="false"/>
- <xsl:param name="isDebugMode" select="boolean($debug)"/>
-
-<!-- *************************************************************************
- OPTIONAL: NEEDED IN CONNECTION WITH A GLOBAL DOCUMENT -->
-
- <!--SUMMARY:
- following parameter triggers a (quite time consuming) enabling of bookmarks in the table-of-content.
- IN DETAIL:
- Currently some links used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
- is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
- links in the Office XML.
- A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
- can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
- All header titles gonna be encoding to be usable in a relative URL. -->
- <xsl:param name="disableLinkedTableOfContent" select="false()"/>
-
- <!-- The chapter numbers of the current document (as a sequence of a global document) is dependent of the number
- of chapter of the same level in preceding documents. -->
- <xsl:param name="precedingChapterLevel1" select="0"/>
- <xsl:param name="precedingChapterLevel2" select="0"/>
- <xsl:param name="precedingChapterLevel3" select="0"/>
- <xsl:param name="precedingChapterLevel4" select="0"/>
- <xsl:param name="precedingChapterLevel5" select="0"/>
- <xsl:param name="precedingChapterLevel6" select="0"/>
- <xsl:param name="precedingChapterLevel7" select="0"/>
- <xsl:param name="precedingChapterLevel8" select="0"/>
- <xsl:param name="precedingChapterLevel9" select="0"/>
- <xsl:param name="precedingChapterLevel10" select="0"/>
-
- <!-- XML documents containing a table of contents,
- gonna link for usability reason above each chapter to the preceding and following document and the content table -->
- <xsl:param name="contentTableURL"/>
-
- <!-- Needed for the bug workaround of missing content table links
- by this ambigous HTML references from the content table can be evoided-->
- <xsl:param name="globalDocumentRefToCurrentFile"/>
-
- <!-- Needed for the bug workaround of missing content table links
- by this node-set the relation between content-table link and children document header can be unambigous established -->
- <xsl:param name="contentTableHeadings"/>
-
-
-<!-- END OF GLOBAL DOCUMENT SECTION
-*************************************************************************-->
-
-
-
- <!-- works for normal separated zipped xml files as for flat filter single xml file format as well -->
- <xsl:variable name="office:meta-file" select="document($metaFileURL)"/>
- <xsl:variable name="office:styles-file" select="document($stylesFileURL)"/>
- <xsl:variable name="office:font-decls" select="$office:styles-file/*/office:font-decls"/>
- <xsl:variable name="office:styles" select="$office:styles-file/*/office:styles"/>
- <!-- office:automatic-styles may occure in two different files (i.d. content.xml and styles.xml). Furthermore the top level tag is different in a flat xml file -->
- <xsl:variable name="office:automatic-styles" select="/*/office:automatic-styles"/>
-
- <!-- simple declaration of WML used to avoid parser errors -->
- <xsl:variable name="wap-paragraph-elements-without-table-row"/>
- <xsl:variable name="wap-paragraph-elements"/>
- <xsl:template name="wml-repeat-write-row"/>
-
-
- <!-- ************************************* -->
- <!-- *** build the propriate HTML file *** -->
- <!-- ************************************* -->
-
- <xsl:template match="/">
-
- <!--<xsl:message>
-
-
- Entered the styleSheets, transformation begins... </xsl:message>-->
-
- <xsl:choose>
- <xsl:when test="$isDebugMode">
- <xsl:call-template name="check-parameter"/>
-
- <xsl:if test="not($isJavaDisabled)">
- <xsl:call-template name="debug-style-collecting-time"/>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <!-- to access the variable like a node-set it is necessary to convert it
- from a result-tree-fragment (RTF) to a node set using the James Clark extension -->
- <xsl:variable name="collectedGlobalData-RTF">
- <xsl:call-template name='create-all-inline-styles'/>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:call-template name="start">
- <xsl:with-param name="collectedGlobalData" select="xt:node-set($collectedGlobalData-RTF)"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:call-template name="start">
- <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($collectedGlobalData-RTF)"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="NodeSetFunctionNotAvailable"/>
- <xsl:call-template name="start"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <xsl:template name="start">
- <xsl:param name="collectedGlobalData"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="html">
- <xsl:element name="head">
- <xsl:if test="$isDebugMode"><xsl:message>CSS helper variable will be created....</xsl:message></xsl:if>
- <xsl:call-template name='common-header-properties'/>
- <xsl:if test="$isDebugMode"><xsl:message>CSS variable ready, header will be created....</xsl:message></xsl:if>
- <!-- constructing the css header simulating inheritance of style-families by style order -->
- <xsl:call-template name='create-css-styleheader'/>
- <xsl:if test="$isDebugMode"><xsl:message>CSS header creation finished!</xsl:message></xsl:if>
- </xsl:element>
-
-
-
- <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
- <xsl:element name="body">
- <!-- background image -->
- <xsl:if test="$backgroundImageURL">
- <xsl:attribute name="background">
- <xsl:choose>
- <!-- for images jared in open office document -->
- <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
- <!-- creating an absolute http URL to the contained/packed image file -->
- <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:if>
-
- <!-- processing the content of the xml file -->
- <xsl:apply-templates select="/*/office:body">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
-
- </xsl:element>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINING +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="html">
- <xsl:element name="head">
- <xsl:call-template name='common-header-properties'/>
- </xsl:element>
-
- <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
- <xsl:element name="body">
- <!-- background image -->
- <xsl:if test="$backgroundImageURL">
- <xsl:attribute name="background">
- <xsl:choose>
- <!-- for images jared in open office document -->
- <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
- <!-- creating an absolute http URL to the contained/packed image file -->
- <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:if>
- <xsl:apply-templates select="/*/office:body">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ PALM-VII (3.2 HTML SUBSET) +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <!-- the proxy will convert the html file later to PQA -->
- <xsl:element name="html">
- <xsl:element name="head">
- <xsl:call-template name='palm-header-properties'/>
- </xsl:element>
-
- <xsl:element name="body">
- <!-- processing the content of the xml file -->
- <xsl:apply-templates select="/*/office:body">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:element>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
-
- <!-- ********************************************* -->
- <!-- *** Header for CSS_INLINED and CSS_HEADER *** -->
- <!-- ********************************************* -->
-
- <xsl:template name='common-header-properties'>
- <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:title"/>
- <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:description"/>
-<!--2DO add further header elements..
- <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:subject"/>
- <xsl:apply-templates select="$office:meta-file/*/office:meta/meta:keywords[postition()=1]"/>-->
- </xsl:template>
-
- <xsl:template match="dc:title">
- <xsl:element name="title">
- <xsl:value-of select="."/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="dc:description">
- <xsl:element name="meta">
- <xsl:attribute name="name">
- <xsl:text>description</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="content">
- <xsl:value-of select="."/>
- </xsl:attribute>
- </xsl:element>
- </xsl:template>
-
-
- <!-- ********************************************* -->
- <!-- *** Measuring the time for style creating *** -->
- <!-- ********************************************* -->
-
-
- <xsl:template name="debug-style-collecting-time">
-
- <xsl:variable name="startTime-RTF">
- <xsl:choose>
- <xsl:when test="function-available('system:current-time-millis')">
- <xsl:value-of select="system:current-time-millis()"/>
- </xsl:when>
- <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
- <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
- </xsl:when>
- </xsl:choose>
- </xsl:variable>
-
-
-
- <xsl:variable name="collectedGlobalData-RTF">
- <xsl:call-template name='create-all-inline-styles'/>
- </xsl:variable>
-
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:message>Creating the inline styles....</xsl:message>
- <xsl:variable name="startTime" select="number(xt:node-set($startTime-RTF))"/>
- <xsl:variable name="collectedGlobalData" select="xt:node-set($collectedGlobalData-RTF)"/>
- <xsl:variable name="endTime" select="system:current-time-millis()"/>
-
- <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
- <xsl:call-template name="start">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:message>Creating the inline styles....</xsl:message>
- <xsl:variable name="startTime" select="number(xalan:nodeset($startTime-RTF))"/>
- <xsl:variable name="endTime" select="java:java.lang.System.currentTimeMillis()"/>
- <xsl:variable name="collectedGlobalData" select="xalan:nodeset($collectedGlobalData-RTF)"/>
-
- <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
- <xsl:call-template name="start">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
-
- </xsl:template>
-
- <!-- DEBUG purpose only: checking the parameters of this template-->
- <xsl:template name="check-parameter">
- <xsl:message>Parameter dpi: <xsl:value-of select="$dpi"/></xsl:message>
- <xsl:message>Parameter metaFileURL: <xsl:value-of select="$metaFileURL"/></xsl:message>
- <xsl:message>Parameter stylesFileURL: <xsl:value-of select="$stylesFileURL"/></xsl:message>
- <xsl:message>Parameter absoluteSourceDirRef: <xsl:value-of select="$absoluteSourceDirRef"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel1 : <xsl:value-of select="$precedingChapterLevel1"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel2 : <xsl:value-of select="$precedingChapterLevel2"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel3 : <xsl:value-of select="$precedingChapterLevel3"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel4 : <xsl:value-of select="$precedingChapterLevel4"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel5 : <xsl:value-of select="$precedingChapterLevel5"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel6 : <xsl:value-of select="$precedingChapterLevel6"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel7 : <xsl:value-of select="$precedingChapterLevel7"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel8 : <xsl:value-of select="$precedingChapterLevel8"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel9 : <xsl:value-of select="$precedingChapterLevel9"/></xsl:message>
- <xsl:message>Parameter precedingChapterLevel10: <xsl:value-of select="$precedingChapterLevel10"/></xsl:message>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
- <xsl:output cdata-section-elements="meta"/>
-
-
- <!-- **************************** -->
- <!-- *** specific palm header *** -->
- <!-- **************************** -->
-
- <xsl:template name='palm-header-properties'>
- <xsl:element name="meta">
- <xsl:attribute name="name">PalmComputingPlatform</xsl:attribute>
- <xsl:attribute name="content">true</xsl:attribute>
- </xsl:element>
- <xsl:element name="meta">
- <xsl:attribute name="name">HandheldFriendly</xsl:attribute>
- <xsl:attribute name="content">true</xsl:attribute>
- </xsl:element>
- <xsl:element name="meta">
- <xsl:attribute name="name">HistoryListText</xsl:attribute>
- <xsl:attribute name="content">Dateimanager : &date &time</xsl:attribute>
- </xsl:element>
- <xsl:element name="meta">
- <xsl:attribute name="name">description</xsl:attribute>
- <xsl:attribute name="content">StarPortal</xsl:attribute>
- </xsl:element>
- <xsl:element name="meta">
- <xsl:attribute name="name">keywords</xsl:attribute>
- <xsl:attribute name="content">starportal, staroffice, software</xsl:attribute>
- </xsl:element>
- <xsl:element name="meta">
- <xsl:attribute name="http-equiv">Content-Type</xsl:attribute>
- <xsl:attribute name="content">text/html; charset=iso-8859-1</xsl:attribute>
- </xsl:element>
- </xsl:template>
-
-
- <!-- ********************************* -->
- <!-- *** creating table attributes *** -->
- <!-- ********************************* -->
-
- <!-- table data (td) and table header (th) attributes -->
- <xsl:template name="create-attribute-ALIGN">
- <xsl:param name="styleProperties"/>
-
- <xsl:if test="contains($styleProperties, 'align')">
- <xsl:attribute name="align">
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'align:left')">
- <xsl:text>left</xsl:text>
- </xsl:when>
- <xsl:when test="contains($styleProperties, 'align:right')">
- <xsl:text>right</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>center</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:if>
- </xsl:template>
-
-
- <!-- ********************************* -->
- <!-- *** creating List attributes *** -->
- <!-- ********************************* -->
-<!--
- <xsl:template name="create-list-attributes">
- <xsl:param name="styleProperties"/>
-
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-2 be implemented
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
- </xsl:template>
--->
-
- <!-- ************************************************ -->
- <!-- *** creating nested format tags (PALM & WML) *** -->
- <!-- ************************************************ -->
-
- <!-- Italic -->
- <xsl:template name="create-nested-format-tags">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'italic')">
- <xsl:element name="i">
- <xsl:call-template name="bold">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="bold">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- Bold -->
- <xsl:template name="bold">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
-
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'bold')">
- <xsl:element name="b">
- <xsl:call-template name="underline">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="underline">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- Underline : last format attribute, which is also used from WML - WML ends here! -->
- <xsl:template name="underline">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
-
- <xsl:choose>
- <xsl:when test="$outputType = 'PALM'">
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'underline')">
- <xsl:element name="u">
- <xsl:call-template name="strikethrough">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="strikethrough">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'underline')">
- <xsl:element name="u">
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- strikethrough -->
- <xsl:template name="strikethrough">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
-
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'strike')">
- <xsl:element name="strike">
- <xsl:call-template name="align">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="align">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- Alignment -->
- <xsl:template name="align">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
-
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'align')">
- <xsl:element name="div">
- <xsl:attribute name="align">
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'align:left')">
- <xsl:text>left</xsl:text>
- </xsl:when>
- <xsl:when test="contains($styleProperties, 'align:right')">
- <xsl:text>right</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>center</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- <xsl:call-template name="font_combined">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="font_combined">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- Both size and Color for font -->
- <xsl:template name="font_combined">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
-
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'color') and contains($styleProperties, 'size')">
- <xsl:element name="font">
-
- <xsl:attribute name="color">
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'color:#000000')">
- <xsl:text>#000000</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>#FFFFFF</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
-
- <xsl:attribute name="size">
- <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
- </xsl:attribute>
-
- <!-- get the embedded content -->
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:call-template name="font_simple">
- <xsl:with-param name="styleProperties" select="$styleProperties"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- size or Color for font -->
- <xsl:template name="font_simple">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="styleProperties"/>
-
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'color')">
- <xsl:element name="font">
- <xsl:attribute name="color">
- <xsl:choose>
- <xsl:when test="contains($styleProperties, 'color:#000000')">
- <xsl:text>#000000</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>#FFFFFF</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
-
- <!-- get the embedded content -->
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:when>
-
- <xsl:when test="contains($styleProperties, 'size')">
- <xsl:element name="font">
- <xsl:attribute name="size">
- <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
- </xsl:attribute>
-
- <!-- get the embedded content -->
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- get the embedded content -->
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
-
- <!-- ****************************** -->
- <!-- *** style sheet processing *** -->
- <!-- ****************************** -->
-
-
- <xsl:template name='create-css-styleheader'>
- <xsl:comment>
- <xsl:text>The CSS style header method for setting styles</xsl:text>
- </xsl:comment>
- <xsl:element name="style">
- <xsl:attribute name="type">text/css</xsl:attribute>
- <xsl:comment>
- <xsl:text>
-
- </xsl:text>
- <xsl:call-template name="write-default-styles"/>
-
- <!-- THE STYLE PROPERTIES OF THE FIRST WRITTEN STYLE (PARENT) IS GIVEN OUT -->
-
- <!-- 1) styles from office:styles are possible parent from all (itself or office:automatic-styles).
- Therefore they are created first.
- Beginning with the top-level parents (the styles without any parent). -->
- <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
-
- <xsl:call-template name="write-styleproperty-line"/>
- <xsl:call-template name="write-styleproperty-lines-for-children"/>
- </xsl:for-each>
-
- <xsl:text> </xsl:text>
-
- <!-- 2) styles from office:automatic-styles can only be parent of styles from the office:automatic-styles section.
- Beginning with top-level styles, again, all children style will be recursivly traversed -->
- <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
- <xsl:call-template name="write-styleproperty-line">
- <xsl:with-param name="searchOnlyInAutomaticStyles" select="true()"/>
- </xsl:call-template>
- <xsl:call-template name="write-styleproperty-lines-for-children">
- <xsl:with-param name="searchOnlyInAutomaticStyles"/>
- </xsl:call-template>
- </xsl:for-each>
- //</xsl:comment>
- </xsl:element>
- </xsl:template>
-
-
- <xsl:template name='write-styleproperty-line'>
- <xsl:param name="searchOnlyInAutomaticStyles"/>
-
- <xsl:variable name="styleProperties">
- <xsl:call-template name="write-style-properties">
- <xsl:with-param name="styleAttributePath" select="current()/style:properties/@*"/>
- </xsl:call-template>
- </xsl:variable>
-
- <!-- do not write styles with no css property -->
- <xsl:if test="not(string-length($styleProperties) = 0)">
- <!-- write out the name of the current (parent) style in the CSS headersection (e.g. "span.myStyle") -->
- <xsl:call-template name="write-style-name">
- <xsl:with-param name="is-parent-style" select="true()"/>
- </xsl:call-template>
-
- <!-- the names of all styles children will be written out(office:style AND office:automatic-style) -->
- <xsl:call-template name="write-children-style-names">
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="searchOnlyInAutomaticStyles"/>
- </xsl:call-template>
-
- <!-- the style properties of the first written style (parent) is given out -->
- <xsl:text> {
- </xsl:text>
- <xsl:value-of select="$styleProperties"/>
- <xsl:text>}
- </xsl:text>
-
- </xsl:if>
-
-
-
- </xsl:template>
-
-
-
-
- <!-- RECURSION WITH ENDCONDITON: adding style classes for all existing childs -->
- <xsl:template name='write-styleproperty-lines-for-children'>
- <xsl:param name="searchOnlyInAutomaticStyles"/>
-
- <xsl:variable name="parentStyleName" select="@style:name"/>
- <xsl:variable name="parentStyleFamily" select="@style:family"/>
-
- <xsl:if test="not(searchOnlyInAutomaticStyles)">
- <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
- <xsl:call-template name="write-styleproperty-line"/>
- <xsl:call-template name="write-styleproperty-lines-for-children"/>
- </xsl:for-each>
- </xsl:if>
- <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
- <xsl:call-template name="write-styleproperty-line">
- <xsl:with-param name="searchOnlyInAutomaticStyles"/>
- </xsl:call-template>
- <xsl:call-template name="write-styleproperty-lines-for-children">
- <xsl:with-param name="searchOnlyInAutomaticStyles"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:template>
-
-
- <xsl:template name="write-default-styles">
-
- <!-- some default attributes in xml have to be explicitly set in HTML (e.g. margin-top="0") -->
- <xsl:text>*.OOo_defaults</xsl:text>
-
- <xsl:for-each select="$office:styles/style:style">
- <xsl:text>, </xsl:text>
- <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
- </xsl:for-each>
-
- <xsl:for-each select="$office:automatic-styles/style:style">
- <xsl:text>, </xsl:text>
- <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
- </xsl:for-each>
- <!-- 2DO: the defaults might be better collected and written in a separated (XML) file -->
-<xsl:text> {
- margin-top:0cm; margin-bottom:0cm; }
- </xsl:text>
-
- <xsl:for-each select="$office:styles/style:default-style">
- <xsl:call-template name="write-default-style"/>
- </xsl:for-each>
-
- <xsl:for-each select="$office:automatic-styles/style:default-style">
- <xsl:call-template name="write-default-style"/>
- </xsl:for-each>
-
- </xsl:template>
-
-
-
- <xsl:template name="write-default-style">
- <xsl:variable name="family-style" select="@style:family"/>
-
- <!-- some default attributes for format families (e.g. graphics, paragraphs, etc.) written as style:default-style -->
- <xsl:value-of select="concat('*.', translate($family-style, '. %()/\', ''), '_defaults')"/>
-
- <xsl:for-each select="$office:styles/style:style[@style:family = $family-style]">
- <xsl:text>, </xsl:text>
- <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
- </xsl:for-each>
-
- <xsl:for-each select="$office:automatic-styles/style:style[@style:family = $family-style]">
- <xsl:text>, </xsl:text>
- <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
- </xsl:for-each>
-
-
- <xsl:variable name="styleProperties">
- <xsl:call-template name="write-style-properties">
- <xsl:with-param name="styleAttributePath" select="current()/style:properties/@*"/>
- </xsl:call-template>
- </xsl:variable>
-
- <!-- do not write styles with no css property -->
- <xsl:if test="not(string-length($styleProperties) = 0)">
- <!-- the style properties of the first written style (parent) is given out -->
- <xsl:text> {
- </xsl:text>
- <xsl:value-of select="$styleProperties"/>
- <xsl:text>}
- </xsl:text>
- </xsl:if>
-
- </xsl:template>
-
-
- <!--++
- The parent style will be written out!
- For each Style:family a prefix must be added
- <!ENTITY % styleFamily
- "(paragraph|text|section|table|table-column|table-row|table-cell|table-page|chart|graphics|default|drawing-page|presentation|control)">
- ++-->
- <xsl:template name="write-style-name">
- <xsl:param name="is-parent-style"/>
-
- <!-- This construct is for list elements. Whenever a paragraph element is being used as child of a list element the name paragraph style is been used for
- the list item. This can be switched as the paragaph style-name and the list-style-name are in the same element.
- Otherwise there would be formatting errors (e.g. margin-left will be used for the content in the list elment and not for the list element itself). -->
- <xsl:variable name="style-name">
- <xsl:choose>
- <xsl:when test="@style:list-style-name">
- <xsl:value-of select="@style:list-style-name"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="@style:name"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:if test="not($is-parent-style)">
- <xsl:text>, </xsl:text>
- </xsl:if>
-
- <xsl:choose>
- <!-- normally 'p.' would be used as CSS element,
- but header (h1, h2,...) are also from the style:family paragraph -->
- <xsl:when test="@style:family='paragraph'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='text'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='section'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='table'">
- <xsl:value-of select="concat('table.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='table-column'">
- <!-- as column styles have to be included as span styles AFTER the table (no two class attributes in TD allowed -->
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='table-row'">
- <xsl:value-of select="concat('tr.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='table-cell'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='table-page'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='chart'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='graphics'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='default'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='drawing-page'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='presentation'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- <xsl:when test="@style:family='control'">
- <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- finding all style child of a section and give their styleIdentifier to the output -->
- <xsl:template name='write-children-style-names'>
- <xsl:param name="parentStyleName" select="@style:name"/>
- <xsl:param name="parentStyleFamily" select="@style:family"/>
- <xsl:param name="searchOnlyInAutomaticStyles"/>
-
-
- <!--** the names of all office:styles children will be written out
- ** (a automatic style can only have children in the office:automatic-style section) -->
-
- <!-- if NOT called from a office:automatic-style parent -->
- <xsl:if test="not(searchOnlyInAutomaticStyles)">
- <!-- for all children in the office:style section -->
- <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
- <!-- write the style name in the css header -->
- <xsl:call-template name="write-style-name"/>
-
- <!-- search for child styles -->
- <xsl:call-template name="write-children-style-names">
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- </xsl:call-template>
-
- </xsl:for-each>
- </xsl:if>
-
- <!--** the names of all office:automatic-styles children will be written out -->
-
- <!-- for all children in the office:automatic-style section -->
- <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
- <!-- write the style name in the css header -->
- <xsl:call-template name="write-style-name"/>
-
- <!-- search for child styles -->
- <xsl:call-template name="write-children-style-names">
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="searchOnlyInAutomaticStyles"/>
- </xsl:call-template>
-
- </xsl:for-each>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
-
- <!-- ********************************************* -->
- <!-- *** hard attributed (inlined) properties *** -->
- <!-- ********************************************* -->
-
-
- <!-- RESTRICTIONS:
- 1) As the styles-node-variables are NOT global, the style variables are not global, either!!
- 2) As a list of elements can only be added to a variable as a result tree fragment the
- extension is neccessary!!
- -->
-
- <!-- 2DO: Inline styles do not inherit from XML office defaults nor font:family defaults as the style header does
- (cp. stylesheet 'style_header.xsl' and the 'write-default-styles' template) -->
-
- <xsl:template name='create-all-inline-styles'>
-
- <!--** traversee all style trees and their branches collecting style properties **-->
- <xsl:element name="allstyles">
- <!--** traversee all office:styles trees beginning with the top-level styles**-->
- <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
-
- <!--** give out the style properties of the parent node **-->
- <xsl:call-template name='write-current-and-inherited-style-properties'>
- <xsl:with-param name="styles-node" select="$office:styles"/>
- <xsl:with-param name="style-family" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
-
- <!--** all office:styles children of the current top-level office:styles **-->
- <xsl:call-template name='for-all-templates-child-styles'>
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
-
- <!--** all office:automatic-styles children of the current top-level style **-->
- <xsl:call-template name='for-all-automatic-child-styles'>
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
- </xsl:for-each>
-
- <!--** traversee all office:automatic-styles trees beginning with the top-level styles **-->
- <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
- <!--** give out the style properties of the parent node **-->
- <xsl:call-template name='write-current-and-inherited-style-properties'>
- <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
- <xsl:with-param name="style-family" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
-
- <!--** all children of the top-level office:automatic-styless **-->
- <xsl:call-template name='for-all-automatic-child-styles'>
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:element>
- </xsl:template>
-
-
-
- <xsl:template name='for-all-templates-child-styles'>
- <xsl:param name="parentStyleName"/>
- <xsl:param name="parentStyleFamily"/>
- <xsl:param name="style-name-tokenized"/>
-
- <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
- <!--** give out the style properties of the current node **-->
- <xsl:element name="{$style-name-tokenized}">
- <xsl:call-template name='write-current-and-inherited-style-properties'>
- <xsl:with-param name="styles-node" select="$office:styles"/>
- <xsl:with-param name="style-family" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
- </xsl:element>
-
- <!--** for all template-children of the current office:styles **-->
- <xsl:call-template name='for-all-templates-child-styles'>
- <xsl:with-param name="styles-node" select="$office:styles"/>
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
-
- <!--** for all automatic-children of the current office:styles **-->
- <xsl:call-template name='for-all-automatic-child-styles'>
- <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
-
- </xsl:for-each>
- </xsl:template>
-
-
-
- <xsl:template name='for-all-automatic-child-styles'>
- <xsl:param name="styles-node"/>
- <xsl:param name="parentStyleName"/>
- <xsl:param name="parentStyleFamily"/>
- <xsl:param name="style-name-tokenized"/>
-
- <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
- <!--** give out the style properties of the current node **-->
- <xsl:element name="{$style-name-tokenized}">
- <xsl:call-template name='write-current-and-inherited-style-properties'>
- <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
- <xsl:with-param name="style-family" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
- </xsl:element>
-
- <!--** for all automatic-children of the current office:automatic-styles **-->
- <xsl:call-template name='for-all-automatic-child-styles'>
- <xsl:with-param name="styles-node" select="$office:automatic-styles"/>
- <xsl:with-param name="parentStyleName" select="@style:name"/>
- <xsl:with-param name="parentStyleFamily" select="@style:family"/>
- <xsl:with-param name="style-name-tokenized" select="translate(@style:name, '. %()/\', '')"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:template>
-
-
- <xsl:template name='write-current-and-inherited-style-properties'>
- <xsl:param name="style-family"/>
- <xsl:param name="styles-node"/>
- <xsl:param name="style-name-tokenized"/>
-
- <xsl:element name="{$style-name-tokenized}">
- <xsl:variable name="current-style-name" select="@style:name"/>
- <xsl:variable name="parent-style-name" select="@style:parent-style-name"/>
-
- <xsl:variable name="new-property-list">
- <!--*** COLLECT STYLE ATTRIBUTES (only toplevel) ***-->
- <xsl:call-template name="write-style-properties">
- <xsl:with-param name="styleAttributePath" select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*"/>
- </xsl:call-template>
- </xsl:variable>
- <xsl:choose>
- <!--*** @End: GIVE OUT All COLLECTED STYLE ATTRIBUTES (only toplevel) ***-->
- <xsl:when test="string-length($parent-style-name)=0">
- <!--** if no styleParent is given, the properties are given out at once **-->
- <xsl:value-of select="normalize-space($new-property-list)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:variable name="new-property-names">
- <xsl:for-each select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*">
- <xsl:value-of select="name()"/>
- </xsl:for-each>
- </xsl:variable>
- <!--** further attributes of the parent style must be collected **-->
- <xsl:call-template name="add-parent-style-attributes">
- <xsl:with-param name="property-name-list" select="$new-property-names"/>
- <xsl:with-param name="complete-property-list" select="normalize-space($new-property-list)"/>
- <xsl:with-param name="current-style-name" select="$current-style-name"/>
- <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
- <xsl:with-param name="style-family" select="$style-family"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:template>
-
-
-
- <xsl:template name="add-parent-style-attributes">
- <xsl:param name="property-name-list"/>
- <xsl:param name="complete-property-list"/>
- <xsl:param name="current-style-name"/>
- <xsl:param name="parent-style-name"/>
- <xsl:param name="style-family"/>
-
- <!--*** New two be added property names will be collected (only one variable per template) ***-->
- <xsl:variable name="new-property-names">
- <xsl:call-template name="get-new-style-names">
- <xsl:with-param name="property-name-list" select="$property-name-list"/>
- <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
- <xsl:with-param name="current-style-name" select="$current-style-name"/>
- </xsl:call-template>
- </xsl:variable>
-
- <xsl:choose>
- <!--*** check if the new parent style exist in the office:automatic-styles section (defined by name and family) ***-->
- <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$current-style-name]">
- <!--*** RECURSION: adding new parent style attributes to the current style ***-->
- <xsl:variable name="new-property-attributes">
- <xsl:call-template name="get-new-style-attributes">
- <xsl:with-param name="new-property-names" select="$new-property-names"/>
- <xsl:with-param name="current-style-name" select="$current-style-name"/>
- <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
- </xsl:call-template>
- </xsl:variable>
- <!--*** End CONDITION: the last style parent has already been executed ***-->
- <xsl:variable name="new-parent-style-name" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
- <xsl:choose>
- <xsl:when test="string-length($new-parent-style-name)=0">
- <!--** no further parent is found, the given parameter property-node is the final style -->
- <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
- </xsl:when>
- <xsl:otherwise>
- <!--** further attributes of the parent style must be collected **-->
- <xsl:call-template name="add-parent-style-attributes">
- <xsl:with-param name="property-name-list" select="concat($property-name-list, $new-property-names)"/>
- <xsl:with-param name="complete-property-list" select="concat($complete-property-list,$new-property-attributes)"/>
- <xsl:with-param name="current-style-name" select="$parent-style-name"/>
- <xsl:with-param name="parent-style-name" select="$new-parent-style-name"/>
- <xsl:with-param name="style-family" select="$style-family"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <!--** the specific style (defined by name and family) must be found in the office:styles section -->
- <xsl:otherwise>
- <!--*** RECURSION: adding new parent style attributes to the current style ***-->
- <!--*** adding new parent style attributes to the current style ***-->
- <xsl:variable name="new-property-attributes">
- <xsl:call-template name="get-new-style-attributes">
- <xsl:with-param name="new-property-names" select="$new-property-names"/>
- <xsl:with-param name="current-style-name" select="$current-style-name"/>
- <xsl:with-param name="parent-style-name" select="$parent-style-name"/>
- </xsl:call-template>
- </xsl:variable>
- <!--*** End CONDITION: the last style parent has already been executed ***-->
- <xsl:variable name="new-parent-style-name" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
- <xsl:choose>
- <xsl:when test="string-length($new-parent-style-name)=0">
- <!--** no further parent is found, the given parameter property-node is the final style -->
- <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
- </xsl:when>
- <xsl:otherwise>
- <!--** further attributes of the parent style must be collected ** -->
- <xsl:call-template name="add-parent-style-attributes">
- <xsl:with-param name="property-name-list" select="concat($property-name-list, $new-property-names)"/>
- <xsl:with-param name="complete-property-list" select="concat($complete-property-list,$new-property-attributes)"/>
- <xsl:with-param name="current-style-name" select="$parent-style-name"/>
- <xsl:with-param name="parent-style-name" select="$new-parent-style-name"/>
- <xsl:with-param name="style-family" select="$style-family"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="get-new-style-names">
- <xsl:param name="property-name-list"/>
- <xsl:param name="parent-style-name"/>
- <xsl:param name="current-style-name"/>
- <!--** where to find the specific style (defined by name and family) wheter in office:automatic-styles or office:styles section -->
- <xsl:choose>
- <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
- <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
- <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
-
- <xsl:variable name="new-property-name-list">
- <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
- <xsl:value-of select="name()"/>
- </xsl:for-each>
- </xsl:variable>
- <xsl:value-of select="$new-property-name-list"/>
- </xsl:when>
- <!--** the specific style (defined by name and family) should be found in the office:styles section -->
- <xsl:otherwise>
- <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
- <xsl:variable name="new-property-name-list">
- <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
- <xsl:value-of select="name()"/>
- </xsl:for-each>
- </xsl:variable>
- <xsl:value-of select="$new-property-name-list"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="get-new-style-attributes">
- <xsl:param name="new-property-names"/>
- <xsl:param name="current-style-name"/>
- <xsl:param name="parent-style-name"/>
-
- <!--** where to find the specific style (defined by name and family) whether in office:automatic-styles or office:styles section -->
- <xsl:choose>
- <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
- <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
- <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
- <xsl:variable name="new-property-name-list">
- <xsl:call-template name="write-style-properties">
- <xsl:with-param name="styleAttributePath" select="$parent-property-node/@*[contains($new-property-names, name())]"/>
- </xsl:call-template>
- </xsl:variable>
- <xsl:value-of select="normalize-space($new-property-name-list)"/>
- </xsl:when>
- <!--** otherwise the specific style (defined by name and family) should be found in the office:styles section -->
- <xsl:otherwise>
- <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
- <xsl:variable name="new-property-name-list">
- <xsl:call-template name="write-style-properties">
- <xsl:with-param name="styleAttributePath" select="$parent-property-node/@*[contains($new-property-names, name())]"/>
- </xsl:call-template>
- </xsl:variable>
- <xsl:value-of select="normalize-space($new-property-name-list)"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
- <xsl:template name="write-style-properties">
- <xsl:param name="styleAttributePath"/>
-
- <xsl:choose>
- <!--+++++ CSS PROPERTIES +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
-
- <xsl:for-each select="$styleAttributePath">
- <!-- isDebugModeMESSAGE:
- <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message> -->
-
-
- <!-- <!ATTLIST style:properties style:horizontal-pos (from-left|left|center|right|from-inside|inside|outside)#IMPLIED>-->
- <!-- 2DO: is inside/from-inside also better showable ? -->
- <!-- !!!! 2DO: Still there have to be placed a <br clear='all'/> to disable the flow!!!!-->
- <!-- The OOo attribute 'style:number-wrapped-paragraphs' is currently ignored -->
- <xsl:choose>
- <xsl:when test='name(.)="style:wrap"'>
- <xsl:choose>
- <xsl:when test='.="left"'>
- <xsl:text>float: right; </xsl:text>
- </xsl:when>
- <xsl:when test='.="right"'>
- <xsl:text>float: left; </xsl:text>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test='name(.) = "style:horizontal-pos"'>
- <xsl:choose>
- <xsl:when test='.="left"'>
- <xsl:text>align: left; </xsl:text>
- </xsl:when>
- <xsl:when test='.="right"'>
- <xsl:text>align: right; </xsl:text>
- </xsl:when>
- <xsl:when test='.="center"'>
- <xsl:text>align: center; </xsl:text>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
-<!-- results into a bad view (overlapped) in Mozilla 1.0
- <xsl:when test='name(.) = "table:align"'>
- <xsl:choose>
- <xsl:when test='.="left"'>
- <xsl:text>float: right; </xsl:text>
- </xsl:when>
- <xsl:when test='.="right"'>
- <xsl:text>float: left; </xsl:text>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
--->
-
- <!-- PADDING for all variations: fo:padding, fo:padding-top, fo:padding-bottom, fo:padding-left, fo:padding-right -->
- <xsl:when test='contains(name(.),"fo:padding")'>
- <xsl:text>padding: </xsl:text>
- <xsl:value-of select="."/>
- <xsl:text>; </xsl:text>
- </xsl:when>
- <!--
- fo:border
- fo:border-top
- fo:border-bottom
- fo:border-left
- fo:border-right
-
- At present, all four borders must be set simultaneously by using either
- the fo:border property or by attaching all four of the other border
- properties to an item set element. In the latter case, if one or more
- of the properties is missing their values are assumed to be none. The
- only border styles supported are none or hidden, solid, and double. Any
- other border style specified is displayed as solid. Transparent borders
- are not supported and the border widths thin, medium, and thick are
- mapped to lengths. In addition, only some distinct border widths are
- supported. Unsupported widths are rounded up to the next supported
- width.
- If there are no padding properties specified within the same
- item set element, a default padding is used for sides that have a
- border. A value of 0cm is used for sides without a border.
- (cp. wd-so-xml-text.sdw)
- -->
-
-<!--2DO START: change measurement equally -->
- <xsl:when test='name(.)="fo:border"'>
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,'ch ')"/><xsl:text>; </xsl:text>
- <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
- <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test="contains(., 'cm')">
- <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
- <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
- <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test="contains(., 'pt')">
- <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
- <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
- <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
- <xsl:when test='name(.)="fo:border-top"'>
- <xsl:text>border-top: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:border-bottom"'>
- <xsl:text>border-bottom: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:border-left"'>
- <xsl:text>border-left: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:border-right"'>
- <xsl:text>border-right: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="style:column-width"'>
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:when test='name(.)="style:row-height"'>
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:when test='name(.)="fo:width"'>
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-<!--2DO END: change measurement equally -->
- <xsl:when test='name(.)="fo:font-style"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="style:font-name"'>
- <xsl:text>font-family:</xsl:text>
- <xsl:variable name="content" select="."/>
- <xsl:value-of select="$office:font-decls/style:font-decl[@style:name=$content]/@fo:font-family"/>
- <xsl:text>; </xsl:text>
- <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Italic')">
- <xsl:text>font-style:italic; </xsl:text>
- </xsl:if>
- <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Bold')">
- <xsl:text>font-weight:bold; </xsl:text>
- </xsl:if>
- </xsl:when>
- <xsl:when test='name(.)="fo:font-weight"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:font-size"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:font-family"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:color"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:margin-left"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:margin-right"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:margin-top"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:margin-bottom"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:line-height"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:text-align"'>
- <!-- IMPORTANT is necessary as table cell value alignment is decided by runtime over the valuetype
- Otherwise a table cell style-class will ALWAYS be overwritten by the run-time value -->
- <xsl:choose>
- <xsl:when test="contains(., 'start')">
- <xsl:text>text-align:left ! important; </xsl:text>
- </xsl:when>
- <xsl:when test="contains(., 'end')">
- <xsl:text>text-align:right ! important; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>text-align:</xsl:text><xsl:value-of select='.'/><xsl:text> ! important; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:when test='name(.)="fo:text-indent"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="style:text-background-color"'>
- <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="fo:background-color"'>
- <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="style:background-image"'>
- <xsl:text>background-image:url(</xsl:text><xsl:value-of select="@xlink:href"/><xsl:text>); </xsl:text>
- <xsl:choose>
- <xsl:when test="@style:repeat = 'repeat'">
- <xsl:text>background-repeat:repeat; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>background-repeat:no-repeat; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <!-- text-shadow is a CSS2 feature and yet not common used in user-agents -->
- <xsl:when test='name(.)="fo:text-shadow"'>
- <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="style:text-crossing-out"'>
- <xsl:if test='not(.="none")'>
- <xsl:text>text-decoration:line-through; </xsl:text>
- </xsl:if>
- </xsl:when>
- <xsl:when test='name(.)="style:text-underline"'>
- <xsl:if test='not(.="none")'>
- <xsl:text>text-decoration:underline; </xsl:text>
- </xsl:if>
- </xsl:when>
- <xsl:when test='name(.)="style:text-position"'>
- <xsl:if test='contains(., "sub")'>
- <xsl:text>vertical-align:sub; </xsl:text>
- </xsl:if>
- <xsl:if test='contains(., "sup")'>
- <xsl:text>vertical-align:sup; </xsl:text>
- </xsl:if>
- </xsl:when>
- <!-- isDebugModeMESSAGE:
- <xsl:otherwise>
- <xsl:message>No transformation implemented for attribute-typ <xsl:value-of select="name(.)"/></xsl:message>
- </xsl:otherwise>-->
- </xsl:choose>
- </xsl:for-each>
- </xsl:when>
- <!--+++++ PALM 3.2 SUBSET AND WAP PROPERTIES +++++-->
- <xsl:otherwise>
- <xsl:for-each select="$styleAttributePath">
- <!-- isDebugModeMESSAGE:
- <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message> -->
-
- <!-- BUG WORK AROUND:
- Due to a bug in the XT Processor, it is not possible to create serveral elements in variable and search over them,
- after explicit conversion to nodeset
- This generated sting identifier shall be later changed back to a set of elements
- -->
- <xsl:choose>
- <!--*** FORMAT ATTRIBUTES ***-->
-
- <!-- Italic -->
- <xsl:when test='name(.)="fo:font-style"'>
- <xsl:if test="contains(., 'italic') or contains(., 'oblique')">
- <xsl:text>italic, </xsl:text>
- </xsl:if>
- </xsl:when>
-
- <!-- Boldface -->
- <xsl:when test='name(.)="fo:font-weight"'>
- <xsl:if test="contains(., 'bold') or contains(., 'bolder')">
- <xsl:text>bold, </xsl:text>
- </xsl:if>
- </xsl:when>
-
- <!-- Underline -->
- <xsl:when test='name(.)="style:text-underline"'>
- <xsl:text>underline, </xsl:text>
- </xsl:when>
-
- <!-- Alignment -->
- <xsl:when test='name(.)="fo:text-align"'>
- <xsl:choose>
- <xsl:when test="contains(., 'start')">
- <xsl:text>align:left, </xsl:text>
- </xsl:when>
- <xsl:when test="contains(., 'end')">
- <xsl:text>align:right, </xsl:text>
- </xsl:when>
- <xsl:when test="contains(., 'center')">
- <xsl:text>align:center, </xsl:text>
- </xsl:when>
- </xsl:choose>
- </xsl:when>
-
- <!-- strikethrough -->
- <xsl:when test='name(.)="style:text-crossing-out"'>
- <xsl:text>strike, </xsl:text>
- </xsl:when>
-
- <!-- Font - size (Palm: emulator transformed sizes to available set (e.g. 30 to (probably) 9)-->
- <xsl:when test='name(.)="fo:font-size"'>
- <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
- </xsl:when>
-
- <!-- Font - Color (PALM: but mostly only 2 available)
- black (#000000)
- gray (#808080)(rendered as dark gray)
- silver (#C0C0C0)(rendered as light gray)
- white (#FFFFFF)-->
- <xsl:when test='name(.)="fo:color"'>
- <xsl:choose>
- <xsl:when test="contains(. , '#FFFFFF') or contains(. , '#ffffff') or contains(. , 'white') or contains(. , 'WHITE')">
- <xsl:text>color:#FFFFFF, </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>color:#000000, </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
-
- <!--*** TABLE ATTRIBUTES ***-->
- <xsl:when test='name(.)="fo:font-size"'>
- <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
- </xsl:when>
- <xsl:when test='name(.)="style:column-width"'>
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width, </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:when test='name(.)="style:row-height"'>
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:height; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>:height; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:when test='name(.)="style:width"'> <!--earlier fo:width-->
- <xsl:choose>
- <!-- changing the distance measure: inch to in -->
- <xsl:when test="contains(., 'ch')">
- <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width; </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- </xsl:choose>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
-<!-- 2DO: NAMING CONVENTION variable are written with '-' instead of case-sensitive writing -->
-
-
-
- <!-- ***** MEASUREMENT CONVERSIONS *****
-
- * 1 centimeter = 10 mm
-
- * 1 inch = 25.4 mm
- While the English have already seen the light (read: the metric system), the US
- remains loyal to this medieval system.
-
- * 1 didot point = 0.376065 mm
- The didot system originated in France but was used in most of Europe
-
- * 1 pica point = 0.35146 mm
- The Pica points system was developed in England and is used in Great-Britain and the US.
-
- * 1 PostScript point = 0.35277138 mm
- When Adobe created PostScript, they added their own system of points.
- There are exactly 72 PostScript points in 1 inch.
-
- * 1 pixel = 0.26458333.. mm (by 96 dpi)
- Most pictures have the 96 dpi resolution, but the dpi variable may vary by stylesheet parameter
- -->
-
-
- <!-- changing measure to mm -->
- <xsl:template name="convert2mm">
- <xsl:param name="value"/>
-
- <xsl:param name="centimeter-in-mm" select="10"/>
- <xsl:param name="inch-in-mm" select="25.4"/>
- <xsl:param name="didot-point-in-mm" select="0.376065"/>
- <xsl:param name="pica-point-in-mm" select="0.35146"/>
-
- <xsl:choose>
- <xsl:when test="contains($value, 'cm')">
- <xsl:value-of select="round(number(substring-before($value,'cm' )) * $centimeter-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'in')">
- <xsl:value-of select="round(number(substring-before($value,'in' )) * $inch-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'dpt')">
- <xsl:value-of select="round(number(substring-before($value,'dpt')) * $didot-point-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'ppt')">
- <xsl:value-of select="round(number(substring-before($value,'ppt')) * $pica-point-in-mm)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$value"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- changing measure to cm -->
- <xsl:template name="convert2cm">
- <xsl:param name="value"/>
-
- <xsl:param name="centimeter-in-mm" select="10"/>
- <xsl:param name="inch-in-mm" select="25.4"/>
- <xsl:param name="didot-point-in-mm" select="0.376065"/>
- <xsl:param name="pica-point-in-mm" select="0.35146"/>
-
- <xsl:choose>
- <xsl:when test="contains($value, 'mm')">
- <xsl:value-of select="round(number(substring-before($value, 'mm')) div $centimeter-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'in')">
- <xsl:value-of select="round(number(substring-before($value, 'in')) div $centimeter-in-mm * $inch-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'dpt')">
- <xsl:value-of select="round(number(substring-before($value,'dpt')) div $centimeter-in-mm * $didot-point-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'ppt')">
- <xsl:value-of select="round(number(substring-before($value,'ppt')) div $centimeter-in-mm * $pica-point-in-mm)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$value"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!-- changing measure to inch (cp. section comment) -->
- <xsl:template name="convert2inch">
- <xsl:param name="value"/>
-
- <xsl:param name="centimeter-in-mm" select="10"/>
- <xsl:param name="inch-in-mm" select="25.4"/>
- <xsl:param name="didot-point-in-mm" select="0.376065"/>
- <xsl:param name="pica-point-in-mm" select="0.35146"/>
-
- <xsl:choose>
- <xsl:when test="contains($value, 'mm')">
- <xsl:value-of select="round(number(substring-before($value, 'mm')) div $inch-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'cm')">
- <xsl:value-of select="round(number(substring-before($value, 'cm')) div $inch-in-mm * $centimeter-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'dpt')">
- <xsl:value-of select="round(number(substring-before($value,'dpt')) div $inch-in-mm * $didot-point-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'ppt')">
- <xsl:value-of select="round(number(substring-before($value,'ppt')) div $inch-in-mm * $pica-point-in-mm)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$value"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- changing measure to dpt (cp. section comment) -->
- <xsl:template name="convert2dpt">
- <xsl:param name="value"/>
-
- <xsl:param name="centimeter-in-mm" select="10"/>
- <xsl:param name="inch-in-mm" select="25.4"/>
- <xsl:param name="didot-point-in-mm" select="0.376065"/>
- <xsl:param name="pica-point-in-mm" select="0.35146"/>
-
- <xsl:choose>
- <xsl:when test="contains($value, 'mm')">
- <xsl:value-of select="round(number(substring-before($value, 'mm')) div $didot-point-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'cm')">
- <xsl:value-of select="round(number(substring-before($value, 'cm')) div $didot-point-in-mm * $centimeter-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'in')">
- <xsl:value-of select="round(number(substring-before($value, 'in')) div $didot-point-in-mm * $inch-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'ppt')">
- <xsl:value-of select="round(number(substring-before($value,'ppt')) div $didot-point-in-mm * $pica-point-in-mm)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$value"/>
- </xsl:otherwise>
- </xsl:choose>
-
- </xsl:template>
-
-
- <!-- changing measure to ppt (cp. section comment) -->
- <xsl:template name="convert2ppt">
- <xsl:param name="value"/>
-
- <xsl:param name="centimeter-in-mm" select="10"/>
- <xsl:param name="inch-in-mm" select="25.4"/>
- <xsl:param name="didot-point-in-mm" select="0.376065"/>
- <xsl:param name="pica-point-in-mm" select="0.35146"/>
-
- <xsl:choose>
- <xsl:when test="contains($value, 'mm')">
- <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pica-point-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'cm')">
- <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pica-point-in-mm * $centimeter-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'in')">
- <xsl:value-of select="round(number(substring-before($value, 'in')) div $pica-point-in-mm * $inch-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'dpt')">
- <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pica-point-in-mm * $didot-point-in-mm)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$value"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- changing measure to pixel by via parameter provided dpi (dots per inch) standard factor (cp. section comment) -->
- <xsl:template name="convert2pixel">
- <xsl:param name="value"/>
-
- <xsl:param name="centimeter-in-mm" select="10"/>
- <xsl:param name="inch-in-mm" select="25.4"/>
- <xsl:param name="didot-point-in-mm" select="0.376065"/>
- <xsl:param name="pica-point-in-mm" select="0.35146"/>
- <xsl:param name="pixel-in-mm" select="$inch-in-mm div $dpi"/>
-
- <xsl:choose>
- <xsl:when test="contains($value, 'mm')">
- <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pixel-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'cm')">
- <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pixel-in-mm * $centimeter-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'in')">
- <xsl:value-of select="round(number(substring-before($value, 'in')) div $pixel-in-mm * $inch-in-mm)"/>
- </xsl:when>
- <xsl:when test="contains($value, 'dpt')">
- <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pixel-in-mm * $didot-point-in-mm)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$value"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
- <!-- table row handling -->
- <xsl:include href="table_rows.xsl"/>
- <!-- table column handling -->
- <xsl:include href="table_columns.xsl"/>
- <!-- table cell handling -->
- <xsl:include href="table_cells.xsl"/>
-
-
-
- <!-- ******************* -->
- <!-- *** main table *** -->
- <!-- ******************* -->
-
- <xsl:template match="table:table | table:sub-table">
- <xsl:param name="collectedGlobalData"/>
-
- <!-- a table will only be created if the "scenario" is active -->
- <xsl:if test="string-length(table:scenario/@table:is-active) = 0">
- <!-- collecting all visible "table:table-row" elements of the table -->
- <xsl:variable name="allVisibleTableRows" select="table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
- | table:table-header-rows/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
- | table:table-row-group/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]"/>
- <xsl:choose>
- <!-- for all but WAP/WML devices a table border check is done (cp. "check-for-table-border") -->
- <xsl:when test="not($outputType = 'WML')">
-
- <!-- As the alignment of a table is by 'align' attribut is deprecated and as the CSS 'float' attribute not well displayed,
- we do a little trick by encapsulating the table with a aligned 'div' element-->
- <xsl:variable name="table-alignment" select="$office:automatic-styles/style:style[@style:name = current()/@table:style-name]/style:properties/@table:align"/>
-
- <xsl:choose>
- <xsl:when test="string-length($table-alignment) != 0">
- <xsl:element name="div">
- <xsl:attribute name="align">
- <xsl:choose>
- <xsl:when test='$table-alignment="left" or $table-alignment="margins"'>
- <xsl:text>left</xsl:text>
- </xsl:when>
- <xsl:when test='$table-alignment="right"'>
- <xsl:text>right</xsl:text>
- </xsl:when>
- <xsl:when test='$table-alignment="center"'>
- <xsl:text>center</xsl:text>
- </xsl:when>
- </xsl:choose>
- </xsl:attribute>
- <xsl:element name="table">
-
- <xsl:apply-templates select="@table:style-name">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- <!-- workaround, set table border attribut if any cell-border exists
- <xsl:call-template name="check-for-table-border">
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- </xsl:call-template> -->
- <xsl:call-template name="create-column-style-variable">
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:element>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="table">
- <xsl:apply-templates select="@table:style-name">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
-
- <!-- workaround, set table border attribut if any cell-border exists
- <xsl:call-template name="check-for-table-border">
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- </xsl:call-template> -->
- <xsl:call-template name="create-column-style-variable">
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
-
- </xsl:when>
- <xsl:otherwise>
- <!-- for WML devices only ASCII table are written as tables are not implemented widley.
- Beginning from 'repeat-write-row' the templates are handled by the table_wml.xsl stylesheet -->
- <xsl:call-template name="create-column-style-variable">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:if>
- </xsl:template>
-
-
-
- <xsl:template name="create-column-style-variable">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allVisibleTableRows"/>
-
- <!-- all columns of the table -->
- <xsl:variable name="allTableColumns" select="table:table-column |
- table:table-column-group/descendant::table:table-column |
- table:table-header-columns/descendant::table:table-column"/>
- <!-- allColumnStyleEntries: Containing all columns of the table, hidden and viewed.
- - if a column is hidden, it contains the hidden attribute, otherwise the style-properties will be stored
- - if a column is being repeated, each repeated column is explicitly written as entry in this variable.
- Later (during template "write-cell") the style of the column will be mixed with the cell-style by using
- the position() of the column entry and comparing it with the iterating cell number. -->
- <xsl:variable name="allColumnStyleEntries-RTF">
- <xsl:call-template name="adding-column-styles-entries">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allTableColumns" select="$allTableColumns"/>
- </xsl:call-template>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:call-template name="create-table">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- <xsl:with-param name="allColumnStyleEntries" select="xt:node-set($allColumnStyleEntries-RTF)"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:call-template name="create-table">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
- <xsl:with-param name="allColumnStyleEntries" select="xalan:nodeset($allColumnStyleEntries-RTF)"/>
- </xsl:call-template>
- </xsl:when>
- </xsl:choose>
-
- </xsl:template>
-
-
-
- <xsl:template name="create-table">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allVisibleTableRows"/>
- <xsl:param name="allColumnStyleEntries"/>
-
-
- <!-- Some Office Calc documents simulate a background by repeating the last cell until end of space
- (The value of "table:number-columns-repeated" is enourmous). Writing out all these cells would be fatal.
- Therefore, this global variable shows us the longest row with content.
-
- Earlier only the viewable columns were listed, but it is easier to handle with all columns:
- <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry[not(@column-hidden-flag)])"/> -->
- <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry)"/>
-
-
- <!--isDebugMode-START-->
- <xsl:if test="$isDebugMode">
- <xsl:message>maxRowLength: <xsl:value-of select="$maxRowLength"/></xsl:message>
- <xsl:variable name="numberOfHiddenColumns" select="count($allColumnStyleEntries/column-style-entry[@column-hidden-flag])"/>
- <xsl:message>numberOfHiddenColumns: <xsl:value-of select="$numberOfHiddenColumns"/></xsl:message>
- <xsl:call-template name="table-debug-allColumnStyleEntries">
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- </xsl:call-template>
- </xsl:if>
- <!--isDebugMode-END-->
- <xsl:choose>
- <xsl:when test="$outputType = 'WML'">
- <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
- (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
- 2DO:CHECK WITH XALAN-->
- <xsl:for-each select="$allVisibleTableRows">
- <xsl:call-template name="wml-repeat-write-row">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="number-rows-repeated" select="@table:number-rows-repeated"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:when>
- <xsl:otherwise>
- <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
- (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
- 2DO:CHECK WITH XALAN -->
- <xsl:for-each select="$allVisibleTableRows">
- <xsl:call-template name="repeat-write-row">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="number-rows-repeated" select="@table:number-rows-repeated"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
- </xsl:for-each>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
-
-
- <!-- **************************** -->
- <!-- *** HELPER: table border *** -->
- <!-- **************************** -->
-
- <!-- only one table border for HTML4 or CSS devices which contain one or more 'fo:border-top' attributes (pars pro toto, if one exist the other usually exist, too) -->
- <!-- this was a work-around for the netscape 4.xx but not longer necessary for Mozilla -->
- <xsl:template name="check-for-table-border">
- <xsl:param name="allVisibleTableRows"/>
-
- <xsl:variable name="startTime">
- <xsl:if test="$isDebugMode and not($isJavaDisabled)">
- <xsl:choose>
- <xsl:when test="function-available('system:current-time-millis')">
- <xsl:value-of select="system:current-time-millis()"/>
- </xsl:when>
- <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
- <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
- </xsl:when>
- </xsl:choose>
- </xsl:if>
- </xsl:variable>
-
- <!-- checks if one cell (table:table-cell) of the rows of this table (allVisibleTableRows) contains a border style (i.e. fo:border-top)
- If only one single border element exist, the whole table will gets pre-defined borders (simple heuristic for better browser display) -->
- <xsl:if test="$allVisibleTableRows/table:table-cell[@table:style-name=/*/*/style:style[style:properties/@fo:border-top]/@style:name]">
- <xsl:attribute name="border">1</xsl:attribute>
- <xsl:attribute name="bordercolor">#000000</xsl:attribute>
- <xsl:attribute name="cellpadding">2</xsl:attribute>
- <xsl:attribute name="cellspacing">0</xsl:attribute>
- <xsl:attribute name="page-break-inside">page-break-inside:avoid</xsl:attribute>
- </xsl:if>
-
-
- <!-- check the time for borderchecking (debug)-->
- <xsl:if test="$isDebugMode and not($isJavaDisabled)">
- <xsl:variable name="endTime">
- <xsl:choose>
- <xsl:when test="function-available('system:current-time-millis')">
- <xsl:value-of select="system:current-time-millis()"/>
- </xsl:when>
- <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
- <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
- </xsl:when>
- </xsl:choose>
- </xsl:variable>
- <xsl:message>Time for checking BorderStyle: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
- </xsl:if>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
- <!-- *********************************** -->
- <!-- *** write repeating table cells *** -->
- <!-- *********************************** -->
-
-
- <!-- matching cells to give out -> covered table cells are not written out -->
- <xsl:template match="table:table-cell">
- <xsl:param name="collectedGlobalData"/>
- <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="maxRowLength"/>
-
- <xsl:if test="$isDebugMode">
- <xsl:message>
---------------> table:table-cell has been entered with node value: <xsl:value-of select="."/></xsl:message>
- <xsl:message>table:number-columns-repeated: -<xsl:value-of select="@table:number-columns-repeated"/>-</xsl:message>
- </xsl:if>
-
- <xsl:call-template name="create-column-position-variable">
- <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
-
- </xsl:template>
-
-
-
- <xsl:template name="create-column-position-variable">
- <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="maxRowLength"/>
-
- <!-- column position needed for styles, esp. for column-hidden-flag -->
- <xsl:variable name="preceding-columns">
- <xsl:for-each select="preceding-sibling::*">
- <xsl:element name="quantity">
- <xsl:choose>
- <xsl:when test="string-length(@table:number-columns-repeated) = 0">1</xsl:when>
- <xsl:otherwise><xsl:value-of select="@table:number-columns-repeated"/></xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:for-each>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="function-available('xt:node-set')">
- <xsl:call-template name="create-table-cell">
- <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- <xsl:with-param name="column-position" select="sum(xt:node-set($preceding-columns)/quantity) + 1"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:when test="function-available('xalan:nodeset')">
- <xsl:call-template name="create-table-cell">
- <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- <xsl:with-param name="column-position" select="sum(xalan:nodeset($preceding-columns)/quantity) + 1"/>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:element name="NodeSetFunctionNotAvailable"/>
- <xsl:call-template name="create-table-cell"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="create-table-cell">
- <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="maxRowLength"/>
- <xsl:param name="column-position"/>
-
-
- <xsl:if test="$isDebugMode">
- <xsl:message>NEW VALUE: column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
- </xsl:if>
-
-
- <!-- a hidden column will give out nothing -->
- <xsl:if test="not($allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag)">
- <xsl:choose>
- <!-- when the columns are not repeated the next column-positions raises up to 1, otherwise up to the amount of repeated columns -->
- <xsl:when test="@table:number-columns-repeated">
- <!-- writes multiple entries of a cell -->
- <xsl:call-template name="repeat-write-cell">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="column-position" select="$column-position"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- <xsl:with-param name="number-columns-repeated" select="@table:number-columns-repeated"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <!-- writes an entry of a cell -->
- <xsl:call-template name="write-cell">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="column-position" select="$column-position"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:if>
-
- </xsl:template>
-
-
-
- <xsl:template name="repeat-write-cell">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="column-position"/>
- <xsl:param name="maxRowLength"/>
- <xsl:param name="number-columns-repeated"/>
-
- <xsl:choose>
- <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
- <xsl:when test="$number-columns-repeated > 1 and $maxRowLength > $column-position">
-
- <xsl:if test="$isDebugMode">
- <xsl:message>+++++++++ starting cell writing +++++++++</xsl:message>
- <xsl:message>number-columns-repeated: -<xsl:value-of select="$number-columns-repeated"/>-</xsl:message>
- <xsl:message>maxRowLength: -<xsl:value-of select="$maxRowLength"/>-</xsl:message>
- <xsl:message>column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
- </xsl:if>
-
- <!-- writes an entry of a cell -->
- <xsl:call-template name="write-cell">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="column-position" select="$column-position"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
- <!-- repeat calling this method until all elements written out -->
- <xsl:if test="$isDebugMode">
- <xsl:message>+++++++++ cell repetition +++++++++</xsl:message>
- </xsl:if>
- <xsl:call-template name="repeat-write-cell">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="column-position" select="$column-position + 1"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- <xsl:with-param name="number-columns-repeated" select="$number-columns-repeated - 1"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
- <!-- When the maxRowLength is reached a last entry of a cell is written -->
- <xsl:call-template name="write-cell">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="column-position" select="$column-position"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="write-cell">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="column-position"/>
- <xsl:param name="maxRowLength"/>
-
-
- <xsl:if test="$isDebugMode">
- <xsl:message>WriteTest -> If nothing between '-' write cell -<xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag"/>-</xsl:message>
- </xsl:if>
-
- <xsl:if test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
- <xsl:if test="$isDebugMode">
- <xsl:message>TABLE COLUMN is hidden!</xsl:message>
- </xsl:if>
- </xsl:if>
-
- <xsl:choose>
- <!-- a hidden column will give out nothing -->
- <xsl:when test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
- <xsl:if test="$isDebugMode">
- <xsl:message>TABLE COLUMN is hidden!</xsl:message>
- </xsl:if>
- </xsl:when>
-
- <!-- NOT a hidden column -->
- <xsl:otherwise>
-
- <!-- a table is a table header, when it has a "table:table-header-rows" ancestor -->
- <xsl:variable name="tableDataType">
- <xsl:choose>
- <xsl:when test="ancestor::table:table-header-rows">
- <xsl:text>th</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>td</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:element name="{$tableDataType}">
-
- <xsl:if test="$isDebugMode">
- <xsl:message>
-*****************************************'<xsl:value-of select="$tableDataType"/>' element has been added!</xsl:message>
- </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>
-
-
-
- <!-- *** the cell-style *** -->
- <!-- The cell style has no conclusion with the column style, so we switch the order/priorities due to browser issues
-
- The cell-style depends on two attributes:
-
- 1) table:style-name - the style properties of cell. When they exist, a default alignement (cp. below) will be added for the
- case of no alignment in the style exist.
-
- 2) table:value-type - the value type of the table-cell giving the default alignments.
- By default a string value is left aligned, all other are aligned:right.
- -->
- <xsl:choose>
- <xsl:when test="@table:style-name">
- <xsl:attribute name="style">
-
- <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
- <xsl:variable name="cellStyle" select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
- <xsl:choose>
- <xsl:when test="string-length($cellStyle) > 0 and not(contains($cellStyle, 'text-align'))">
- <!-- CELL-STYLE: alignment by table:value-type -->
- <!-- no alignment in the cell style, the alignment based on the table:value-type will be added -->
- <xsl:choose>
- <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
- <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:right; ')"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:left; ')"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- <xsl:otherwise>
- <!-- CELL-STYLE: alignment by table:value-type -->
- <!-- no CSS style properties exist, only alignment from the table:value-type will be used -->
- <xsl:choose>
- <xsl:when test="@table:value-type and not(@table:value-type = 'string')">text-align:right; </xsl:when>
- <xsl:otherwise>text-align:left; </xsl:otherwise>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
-
- <!-- column-style (disjunct of cell style -->
- <!-- 2DO: only absolut styles are supported, relative styles (i.e. 'style:rel-column-width' e.g. with value "8933*" are ignored.
- Issue: browsers (not sure if CSS) does not support the '*' relationship, only the '%', where the sum is always '100'!
- For this, it is easier to work on with the absolute values, instead of calculating the values for 100% -->
- <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
- </xsl:attribute>
- <!-- CELL-STYLE: table:style-name -->
- <xsl:attribute name="class">
- <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
- </xsl:attribute>
- </xsl:when>
- <xsl:otherwise>
- <xsl:attribute name="style">
- <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
- <!-- no table:style-name exist, only alignment from the table:value-type will be used -->
- <xsl:choose>
- <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
- text-align:right;
- </xsl:when>
- <xsl:otherwise>
- text-align:left;
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:choose>
- <!-- In case of no cell content a non-breakable space will be inserted
- to make the browser show the table-cell grid -->
- <xsl:when test="not(child::text()) and not(child::*)">
- <xsl:text>  </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <!-- *** the column-style *** -->
- <!-- the column style has no conclusion with the cell style, so we switch the order/priorities due to browser issues-->
- <xsl:element name="span">
- <xsl:attribute name="class">
- <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@style-name"/>
- </xsl:attribute>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:element name="{$tableDataType}">
-
- <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:attribute name="style">
- <!-- cell-style -->
- <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
- <!-- column-style -->
- <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
- <!-- TABLE:VALUE-TYPE - the value of a table-cell will be aligned left by default only exlicit non-string is aligned:right-->
- <xsl:choose>
- <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
- <xsl:text>text-align:right;</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>text-align:left;</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:attribute>
-
- <!--   is a non-breakable space, necessary to make to the browser show the table-cell grid -->
- <xsl:if test="not(child::text()) and not(child::*)">  </xsl:if>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:when>
- <!--+++++ PALM INLINED WAY +++++-->
- <xsl:when test="$outputType = 'PALM'">
- <xsl:element name="{$tableDataType}">
- <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>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:when>
- <!--+++++ WML WAY +++++-->
- <xsl:when test="$outputType = 'WML'">
- <xsl:choose>
- <xsl:when test="not($allColumnStyleEntries/column-style-entry[last() = $column-position])">
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- <xsl:text>, </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:apply-templates>
- <xsl:text>; </xsl:text>
- <xsl:element name="br"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
- </xsl:choose>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
- <!-- ******************************************** -->
- <!-- *** Create table columns style variable *** -->
- <!-- ******************************************** -->
-
- <xsl:template name="adding-column-styles-entries">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allTableColumns"/>
-
- <xsl:for-each select="$allTableColumns">
-
- <xsl:variable name="column-style-entry" select="$collectedGlobalData/allstyles/*[name() = translate(current()/@table:style-name, '. %()/\', '')]"/>
- <xsl:choose>
- <xsl:when test="not(@table:number-columns-repeated)">
- <!-- writes an entry of a column in the columns-variable -->
- <xsl:call-template name="adding-column-style-entry">
- <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
- </xsl:call-template>
- </xsl:when>
- <!-- No higher repetition of cells greater than 4 for the last and second last column -->
- <!-- a hack for the sample document 'Waehrungsumrechner.sxc having 230 repeated columns in the second last column -->
- <!-- ??? <xsl:when test="(position() = last() or (position() = (last() - 1)) and @table:number-columns-repeated < 5)"> ???-->
- <xsl:when test="position() = last() or position() = (last() - 1)">
- <xsl:if test="@table:number-columns-repeated < 5">
- <!-- writes an entry of a column in the columns-variable -->
- <xsl:call-template name="repeat-adding-column-style-entry">
- <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
- <xsl:with-param name="number-columns-repeated" select="1"/>
- </xsl:call-template>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <!-- repeated colums will be written explicit several times in the variable-->
- <xsl:call-template name="repeat-adding-column-style-entry">
- <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
- <xsl:with-param name="number-columns-repeated" select="@table:number-columns-repeated"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- </xsl:template>
-
-
- <!-- WRITES THE REPEATED COLUMN STYLE EXPLICIT AS AN ELEMENT IN THE COLUMNS-VARIABLE -->
- <xsl:template name="repeat-adding-column-style-entry">
- <xsl:param name="column-style-entry"/>
- <xsl:param name="number-columns-repeated"/>
-
- <xsl:choose>
- <xsl:when test="$number-columns-repeated > 1">
- <!-- writes an entry of a column in the columns-variable -->
- <xsl:call-template name="adding-column-style-entry">
- <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
- </xsl:call-template>
- <!-- repeat calling this method until all elements written out -->
- <xsl:call-template name="repeat-adding-column-style-entry">
- <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
- <xsl:with-param name="number-columns-repeated" select="$number-columns-repeated - 1"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <!-- writes an entry of a column in the columns-variable -->
- <xsl:call-template name="adding-column-style-entry">
- <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- THE COLUMN-STYLE WRITE-PATTERN FOR EACH COLUMN WRITTEN IN A VARIABLE -->
- <xsl:template name="adding-column-style-entry">
- <xsl:param name="column-style-entry"/>
-
- <xsl:element name="column-style-entry">
- <xsl:choose>
- <xsl:when test="@table:visibility = 'collapse' or @table:visibility = 'filter'">
- <xsl:attribute name="column-hidden-flag">true</xsl:attribute>
- </xsl:when>
- <xsl:otherwise>
- <xsl:variable name="table:style-name" select="translate(@table:style-name, '. %()/\', '')"/>
- <xsl:attribute name="style-name"><xsl:value-of select="$table:style-name"/></xsl:attribute>
- <xsl:value-of select="$column-style-entry"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:template>
-
-
-
- <!--isDebugMode-START-->
- <!-- giving out the 'allColumnStyle' variable:
- For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
- In case of 'column-hidden-flag' attribute the text 'Column is hidden is given out.-->
- <xsl:template name="table-debug-allColumnStyleEntries">
- <xsl:param name="allColumnStyleEntries"/>
-
- <!-- debug output as table summary attribut in html -->
- <xsl:attribute name="summary">
- <xsl:call-template name="table-debug-column-out">
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- </xsl:call-template>
- </xsl:attribute>
- <!-- debug output to console -->
- <xsl:message>
- <xsl:call-template name="table-debug-column-out">
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- </xsl:call-template>
- </xsl:message>
- </xsl:template>
-
-
- <xsl:template name="table-debug-column-out">
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:text>
- DebugInformation: For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
- In case of 'column-hidden-flag' attribute the text 'column is hidden' is given out.
- </xsl:text>
- <xsl:for-each select="$allColumnStyleEntries/column-style-entry">
- <xsl:choose>
- <xsl:when test="@column-hidden-flag">
- <xsl:text> </xsl:text><xsl:value-of select="@style-name"/><xsl:text>column is hidden</xsl:text><xsl:text>
- </xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text> </xsl:text><xsl:value-of select="@style-name"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
- </xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:for-each>
- </xsl:template>
- <!--isDebugMode-END-->
-
-</xsl:stylesheet>
+++ /dev/null
-<!--
-
- The Contents of this file are made available subject to the terms of
- either of the following licenses
-
- - GNU Lesser General Public License Version 2.1
- - Sun Industry Standards Source License Version 1.1
-
- Sun Microsystems Inc., October, 2000
-
- GNU Lesser General Public License Version 2.1
- =============================================
- Copyright 2000 by Sun Microsystems, Inc.
- 901 San Antonio Road, Palo Alto, CA 94303, USA
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License version 2.1, as published by the Free Software Foundation.
-
- 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
-
-
- Sun Industry Standards Source License Version 1.1
- =================================================
- The contents of this file are subject to the Sun Industry Standards
- Source License Version 1.1 (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.openoffice.org/license.html.
-
- Software provided under this License is provided on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
- MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
- See the License for the specific provisions governing your rights and
- obligations concerning the Software.
-
- The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
- Copyright © 2002 by Sun Microsystems, Inc.
-
- All Rights Reserved.
-
- Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:office="http://openoffice.org/2000/office"
- xmlns:style="http://openoffice.org/2000/style"
- xmlns:text="http://openoffice.org/2000/text"
- xmlns:table="http://openoffice.org/2000/table"
- xmlns:draw="http://openoffice.org/2000/drawing"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:number="http://openoffice.org/2000/datastyle"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:chart="http://openoffice.org/2000/chart"
- xmlns:dr3d="http://openoffice.org/2000/dr3d"
- xmlns:math="http://www.w3.org/1998/Math/MathML"
- xmlns:form="http://openoffice.org/2000/form"
- xmlns:script="http://openoffice.org/2000/script"
- office:class="text"
- office:version="1.0"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:meta="http://openoffice.org/2000/meta"
- xmlns:config="http://openoffice.org/2001/config"
- xmlns:help="http://openoffice.org/2000/help"
- xmlns:xt="http://www.jclark.com/xt"
- xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
- xmlns:xalan="http://xml.apache.org/xalan"
- xmlns:java="http://xml.apache.org/xslt/java"
- exclude-result-prefixes="java">
-
-
-
- <!-- ********************************************* -->
- <!-- *** write (explicit) repeating table rows *** -->
- <!-- ********************************************* -->
-
- <xsl:template name="repeat-write-row">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="number-rows-repeated" select="1"/>
- <xsl:param name="maxRowLength"/>
-
- <xsl:choose>
- <!-- write an entry of a row and repeat calling this method until all elements are written out -->
- <xsl:when test="$number-rows-repeated > 1 and (table:table-cell/text() or table:table-cell/*)">
- <xsl:call-template name="write-row">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
-
- <!-- 2DO: take variable from the output of repeated write-row and iterate giving out the variable -->
- <xsl:call-template name="repeat-write-row">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- <xsl:with-param name="number-rows-repeated" select="$number-rows-repeated - 1"/>
- </xsl:call-template>
- </xsl:when>
- <!-- write a single entry of a row -->
- <xsl:otherwise>
- <xsl:call-template name="write-row">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:call-template>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
-
- <xsl:template name="write-row">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="maxRowLength"/>
-
-
- <xsl:element name="tr">
- <!-- writing the style of the row -->
- <xsl:call-template name='add-style-properties'>
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- </xsl:call-template>
-
- <xsl:if test="$isDebugMode">
- <xsl:message>
-*************************'tr' element has been added!</xsl:message>
- </xsl:if>
-
- <xsl:apply-templates select="table:table-cell">
- <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
- <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
- <xsl:with-param name="maxRowLength" select="$maxRowLength"/>
- </xsl:apply-templates>
-
- </xsl:element>
- </xsl:template>
-
-
- <!-- **************************** -->
- <!-- *** HELPER: table styles *** -->
- <!-- **************************** -->
-
- <xsl:template name="add-style-properties">
- <xsl:param name="collectedGlobalData"/>
- <xsl:param name="allColumnStyleEntries"/>
- <xsl:param name="node-position"/>
-
- <xsl:choose>
- <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
- <xsl:when test="$outputType = 'CSS_HEADER'">
- <xsl:attribute name="class">
- <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
- </xsl:attribute>
- </xsl:when>
-
- <!--+++++ HTML 4.0 INLINED WAY +++++-->
- <xsl:when test="$outputType = 'CSS_INLINED'">
- <xsl:attribute name="style">
- <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
- </xsl:attribute>
- </xsl:when>
- </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_pdf class simply outputs the PDF file with the
- * content-type 'application/pdf' enabling web browsers with a PDF viewer
- * plugin to view the PDF file inside the browser.
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_pdf extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_mimepart->getContents(),
- 'status' => array(),
- 'type' => 'application/pdf'
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_php class renders out syntax-highlighted PHP code in
- * HTML format.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Chuck Hagenbuch <chuck@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_php extends Horde_Mime_Viewer_source
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
-
- // Need Horde headers for CSS tags.
- reset($ret);
- $ret[key($ret)]['data'] = Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
- $ret[key($ret)]['data'] .
- Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- ini_set('highlight.comment', 'comment');
- ini_set('highlight.default', 'default');
- ini_set('highlight.keyword', 'keyword');
- ini_set('highlight.string', 'string');
- ini_set('highlight.html', 'html');
-
- $code = $this->_mimepart->getContents();
- $text = (strpos($code, '<?php') === false)
- ? $this->_lineNumber(str_replace('<?php ', '', highlight_string('<?php ' . $code, true)))
- : $this->_lineNumber(highlight_string($code, true));
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $text,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Add line numbers to a block of code.
- *
- * @param string $code The code to number.
- *
- * @return string The code with line numbers added.
- */
- protected function _lineNumber($code, $linebreak = "\n")
- {
- // Clean up.
- $code = preg_replace(
- array(
- '/<code><span style="color: #?\w+">\s*/',
- '/<code><font color="#?\w+">\s*/',
- '/\s*<\/span>\s*<\/span>\s*<\/code>/',
- '/\s*<\/font>\s*<\/font>\s*<\/code>/'
- ), '', $code);
-
- $code = str_replace(
- array(' ', '&', '<br />', '<span style="color: ', '<font color="', '</font>',),
- array(' ', '&', "\n", '<span class="', '<span class="', '</span>',),
- $code);
-
- $code = trim($code);
-
- // Normalize newlines.
- $code = str_replace("\r", '', $code);
- $code = preg_replace('/\n\n\n+/', "\n\n", $code);
-
- $results = array('<ol class="code-listing striped">');
- $previous = false;
-
- $lines = explode("\n", $code);
- reset($lines);
- while (list($lineno, $line) = each($lines)) {
- if (substr($line, 0, 7) == '</span>') {
- $previous = false;
- $line = substr($line, 7);
- }
-
- if (empty($line)) {
- $line = ' ';
- }
-
- if ($previous) {
- $line = "<span class=\"$previous\">" . $line;
- }
-
- // Save the previous style.
- if (strpos($line, '<span') !== false) {
- switch (substr($line, strrpos($line, '<span') + 13, 1)) {
- case 'c':
- $previous = 'comment';
- break;
-
- case 'd':
- $previous = 'default';
- break;
-
- case 'k':
- $previous = 'keyword';
- break;
-
- case 's':
- $previous = 'string';
- break;
- }
- }
-
- // Unset previous style unless the span continues.
- if (substr($line, -7) == '</span>') {
- $previous = false;
- } elseif ($previous) {
- $line .= '</span>';
- }
-
- $results[] = '<li id="l' . ($lineno + 1). '">' . $line . '</li>';
- }
-
- $results[] = '</ol>';
-
- return implode("\n", $results);
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_plain class renders out plain text with URLs made
- * into hyperlinks (if viewing inline).
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_plain extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $text = $this->_mimepart->getContents();
- $charset = $this->_mimepart->getCharset();
-
- /* Check for 'flowed' text data. */
- if ($this->_mimepart->getContentTypeParameter('format') == 'flowed') {
- $text = $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'));
- }
-
- require_once 'Horde/Text/Filter.php';
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => '<html><body><tt>' . Text_Filter::filter($text, 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'charset' => $charset, 'class' => null)) . '</tt></body></html>',
- 'status' => array(),
- 'type' => 'text/html; charset=' . $charset
- )
- );
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- $text = String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset());
-
- /* Check for 'flowed' text data. */
- $data = ($this->_mimepart->getContentTypeParameter('format') == 'flowed')
- ? $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'))
- : $text;
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $data,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Format flowed text for HTML output.
- *
- * @param string $text The text to format.
- * @param boolean $delsp Was text created with DelSp formatting?
- *
- * @return string The formatted text.
- */
- protected function _formatFlowed($text, $delsp = null)
- {
- $flowed = new Horde_Text_Flowed($this->_mimepart->replaceEOL($text, "\n"), $this->_mimepart->getCharset());
- $flowed->setMaxLength(0);
- if (!is_null($delsp)) {
- $flowed->setDelSp($delsp);
- }
- return $flowed->toFixed();
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_rar class renders out the contents of .rar archives
- * in HTML format.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @author Michael Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rar extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
- if (!empty($ret)) {
- reset($ret);
- $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
- }
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- $contents = $this->_mimepart->getContents();
-
- require_once 'Horde/Compress.php';
- $rar = &Horde_Compress::singleton('rar');
-
- $rarData = $rar->decompress($contents);
- if (is_a($rarData, 'PEAR_Error')) {
- return array();
- }
- $fileCount = count($rarData);
-
- require_once 'Horde/Text.php';
-
- $name = $this->_mimepart->getName(true);
- if (empty($name)) {
- $name = _("unnamed");
- }
-
- $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
- '<table><tr><td align="left"><tt><span class="fixed">' .
- Text::htmlAllSpaces(_("Archive Name") . ': ' . $name) . "\n" .
- Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
- Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
- "\n\n" .
- Text::htmlAllSpaces(
- String::pad(_("File Name"), 50, ' ', STR_PAD_RIGHT) .
- String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
- String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT)
- ) . "\n" .
- str_repeat('-', 109) . "\n";
-
- foreach ($rarData as $val) {
- $ratio = empty($val['size'])
- ? 0
- : 100 * ($val['csize'] / $val['size']);
-
- $text .= Text::htmlAllSpaces(
- String::pad($val['name'], 50, ' ', STR_PAD_RIGHT) .
- String::pad($val['attr'], 10, ' ', STR_PAD_LEFT) .
- String::pad($val['size'], 10, ' ', STR_PAD_LEFT) .
- String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT) .
- String::pad($val['method'], 10, ' ', STR_PAD_LEFT) .
- String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT)
- ) . "\n";
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_report class is a wrapper used to load the
- * appropriate Horde_Mime_Viewer for multipart/report data (RFC 3462).
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_report extends Horde_Mime_Viewer_Driver
-{
- /**
- * Return the underlying MIME Viewer for this part.
- *
- * @return mixed A Horde_Mime_Viewer object, or false if not found.
- */
- protected function _getViewer()
- {
- if (!($type = $this->_mimepart->getContentTypeParameter('report-type'))) {
- return false;
- }
-
- $viewer = Horde_Mime_Viewer::factory($this->_mimepart, 'message/' . String::lower($type));
- if ($viewer) {
- $viewer->setParams($this->_params);
- }
- return $viewer;
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_rfc822 class renders out messages from the
- * message/rfc822 content type.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (GPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rfc822 extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => true,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_mimepart->getContents(),
- 'status' => array(),
- 'type' => 'text/plain; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Return the rendered information about the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInfo()
- {
- /* Get the text of the part. Since we need to look for the end of
- * the headers by searching for the CRLFCRLF sequence, use
- * getCanonicalContents() to make sure we are getting the text with
- * CRLF's. */
- $text = $this->_mimepart->getCanonicalContents();
- if (empty($text)) {
- return array();
- }
-
- /* Search for the end of the header text (CRLFCRLF). */
- $text = substr($text, 0, strpos($text, "\r\n\r\n"));
-
- /* Get the list of headers now. */
- $headers = Horde_Mime_Headers::parseHeaders($text);
-
- $header_array = array(
- 'date' => _("Date"),
- 'from' => _("From"),
- 'to' => _("To"),
- 'cc' => _("Cc"),
- 'bcc' => _("Bcc"),
- 'reply-to' => _("Reply-To"),
- 'subject' => _("Subject")
- );
- $header_output = array();
-
- foreach ($header_array as $key => $val) {
- $hdr = $headers->getValue($key);
- if (!empty($hdr)) {
- $header_output[] = '<strong>' . $val . ':</strong> ' . htmlspecialchars($hdr);
- }
- }
-
- require_once 'Horde/Text/Filter.php';
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => empty($header_output) ? '' : ('<div class="mimeHeaders">' . Text_Filter::filter(implode("<br />\n", $header_output), 'emails') . '</div>'),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_richtext class renders out HTML text from
- * text/richtext content tags, (RFC 1896 [7.1.3]).
- *
- * A minimal richtext implementation is one that simply converts "<lt>" to
- * "<", converts CRLFs to SPACE, converts <nl> to a newline according to
- * local newline convention, removes everything between a <comment> command
- * and the next balancing </comment> command, and removes all other
- * formatting commands (all text enclosed in angle brackets).
- *
- * We implement the following tags:
- * <bold>, <italic>, <fixed>, <smaller>, <bigger>, <underline>, <center>,
- * <flushleft>, <flushright>, <indent>, <subscript>, <excerpt>, <paragraph>,
- * <signature>, <comment>, <no-op>, <lt>, <nl>
- *
- * The following tags are implemented differently than described in the RFC
- * (due to limitations in HTML output):
- * <heading> - Output as centered, bold text.
- * <footing> - Output as centered, bold text.
- * <np> - Output as paragraph break.
- *
- * The following tags are NOT implemented:
- * <indentright>, <outdent>, <outdentright>, <samepage>, <iso-8859-X>,
- * <us-ascii>,
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_richtext extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_toHTML(),
- 'status' => array(),
- 'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
- )
- );
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Convert richtext to HTML.
- *
- * @return string The converted HTML string.
- */
- protected function _toHTML()
- {
- $text = trim($this->_mimepart->getContents());
- if ($text == '') {
- return array();
- }
-
- /* We add space at the beginning and end of the string as it will
- * make some regular expression checks later much easier (so we
- * don't have to worry about start/end of line characters). */
- $text = ' ' . $text . ' ';
-
- /* Remove everything between <comment> tags. */
- $text = preg_replace('/<comment.*>.*<\/comment>/Uis', '', $text);
-
- /* Remove any unrecognized tags in the text. We don't need <no-op>
- * in $tags since it doesn't do anything anyway. All <comment> tags
- * have already been removed. */
- $tags = '<bold><italic><fixed><smaller><bigger><underline><center><flushleft><flushright><indent><subscript><excerpt><paragraph><signature><lt><nl>';
- $text = strip_tags($text, $tags);
-
- /* <lt> becomes a '<'. CRLF becomes a SPACE. */
- $text = str_ireplace(array('<lt>', "\r\n"), array('<', ' '), $text);
-
- /* We try to protect against bad stuff here. */
- $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
-
- /* <nl> becomes a newline (<br />);
- * <np> becomes a paragraph break (<p />). */
- $text = str_ireplace(array('<nl>', '<np>'), array('<br />', '<p />'), $text);
-
- /* Now convert the known tags to html. Try to remove any tag
- * parameters to stop people from trying to pull a fast one. */
- $replace = array(
- '/(?<!<)<bold.*>(.*)<\/bold>/Uis' => '<span style="font-weight: bold">\1</span>',
- '/(?<!<)<italic.*>(.*)<\/italic>/Uis' => '<span style="font-style: italic">\1</span>',
- '/(?<!<)<fixed.*>(.*)<\/fixed>/Uis' => '<font face="fixed">\1</font>',
- '/(?<!<)<smaller.*>(.*)<\/smaller>/Uis' => '<span style="font-size: smaller">\1</span>',
- '/(?<!<)<bigger.*>(.*)<\/bigger>/Uis' => '<span style="font-size: larger">\1</span>',
- '/(?<!<)<underline.*>(.*)<\/underline>/Uis' => '<span style="text-decoration: underline">\1</span>',
- '/(?<!<)<center.*>(.*)<\/center>/Uis' => '<div align="center">\1</div>',
- '/(?<!<)<flushleft.*>(.*)<\/flushleft>/Uis' => '<div align="left">\1</div>',
- '/(?<!<)<flushright.*>(.*)<\/flushright>/Uis' => '<div align="right">\1</div>',
- '/(?<!<)<indent.*>(.*)<\/indent>/Uis' => '<blockquote>\1</blockquote>',
- '/(?<!<)<excerpt.*>(.*)<\/excerpt>/Uis' => '<cite>\1</cite>',
- '/(?<!<)<subscript.*>(.*)<\/subscript>/Uis' => '<sub>\1</sub>',
- '/(?<!<)<superscript.*>(.*)<\/superscript>/Uis' => '<sup>\1</sup>',
- '/(?<!<)<heading.*>(.*)<\/heading>/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
- '/(?<!<)<footing.*>(.*)<\/footing>/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
- '/(?<!<)<paragraph.*>(.*)<\/paragraph>/Uis' => '<p>\1</p>',
- '/(?<!<)<signature.*>(.*)<\/signature>/Uis' => '<address>\1</address>'
- );
- $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
- /* Now we remove the leading/trailing space we added at the start. */
- $text = substr($text, 1, -1);
-
- /* Wordwrap. */
- $text = str_replace(array("\t", ' ', "\n "), array(' ', ' ', "\n "), $text);
- if ($text[0] == ' ') {
- $text = ' ' . substr($text, 1);
- }
-
- return '<p style="font-size:100%;font-family:Lucida Console,Courier,Courier New;">' . nl2br($text) . '</p>';
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_rpm class renders out lists of files in RPM
- * packages by using the rpm tool to query the package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rpm extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $data = '';
- $tmp_rpm = Horde::getTempFile('horde_rpm');
-
- file_put_contents($tmp_rpm, $this->_mimepart->getContents());
-
- $fh = popen($this->_conf['location'] . " -qip $tmp_rpm 2>&1", 'r');
- while (($rc = fgets($fh, 8192))) {
- $data .= $rc;
- }
- pclose($fh);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => '<html><body><pre>' . htmlentities($data) . '</pre></body></html>',
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_rtf class renders out Rich Text Format documents in
- * HTML format by using the UnRTF package
- * (http://www.gnu.org/software/unrtf/unrtf.html).
- *
- * Copyright 2007 Duck <duck@obala.net>
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Duck <duck@obala.net>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rtf extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $tmp_rtf = Horde::getTempFile('rtf');
- $tmp_output = Horde::getTempFile('rtf');
-
- file_put_contents($tmp_rtf, $this->_mimepart->getContents());
-
- exec($this->_conf['location'] . " $tmp_rtf > $tmp_output");
-
- if (file_exists($tmp_output)) {
- $data = file_get_contents($tmp_output);
- } else {
- $data = _("Unable to translate this RTF document");
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $data,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_security class is a wrapper used to load the
- * appropriate Horde_Mime_Viewer for secure multipart messages (defined by RFC
- * 1847). This class handles multipart/signed and multipart/encrypted data.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_security extends Horde_Mime_Viewer_Driver
-{
- /**
- * Return the underlying MIME Viewer for this part.
- *
- * @return mixed A Horde_Mime_Viewer object, or false if not found.
- */
- protected function _getViewer()
- {
- if (!($protocol = $this->_mimepart->getContentTypeParameter('protocol'))) {
- return false;
- }
-
- $viewer = Horde_Mime_Viewer::factory($this->_mimepart, $protocol);
- if ($viewer) {
- $viewer->setParams($this->_params);
- }
- return $viewer;
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_simple class renders out plain text without any
- * modifications.
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_simple extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_mimepart->getContents(),
- 'status' => array(),
- 'type' => 'text/plain; charset=' . $this->_mimepart->getCharset()
- )
- );
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset()),
- 'status' => array(),
- 'type' => 'text/plain; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_smil renders SMIL documents to very basic HTML.
- *
- * Copyright 2006-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Jan Schneider <jan@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_smil extends Horde_Mime_Viewer_Driver
-{
- /**
- * Handle for the XML parser object.
- *
- * @var resource
- */
- protected $_parser;
-
- /**
- * String buffer to hold the generated content
- *
- * @var string
- */
- protected $_content;
-
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $this->_content = '';
-
- /* Create a new parser and set its default properties. */
- $this->_parser = xml_parser_create();
- xml_set_object($this->_parser, $this);
- xml_set_element_handler($this->_parser, '_startElement', '_endElement');
- xml_set_character_data_handler($this->_parser, '_defaultHandler');
- xml_parse($this->_parser, $this->_mimepart->getContents(), true);
- xml_parser_free($this->_parser);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_content,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * User-defined function callback for start elements.
- *
- * @param object $parser Handle to the parser instance.
- * @param string $name The name of this XML element.
- * @param array $attrs List of this element's attributes.
- */
- protected function _startElement($parser, $name, $attrs)
- {
- switch ($name) {
- case 'IMG':
- if (isset($attrs['SRC'])) {
- $this->_content .= '<img src="' . htmlspecialchars($attrs['SRC']) . '" />';
- }
- break;
- }
- }
-
- /**
- * User-defined function callback for end elements.
- *
- * @param object $parser Handle to the parser instance.
- * @param string $name The name of this XML element.
- */
- protected function _endElement($parser, $name)
- {
- }
-
- /**
- * User-defined function callback for character data.
- *
- * @param object $parser Handle to the parser instance.
- * @param string $data String of character data.
- */
- protected function _defaultHandler($parser, $data)
- {
- $data = trim($data);
- if (!empty($data)) {
- $this->_content .= ' ' . htmlspecialchars($data);
- }
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_source class is a class for any viewer that wants
- * to provide line numbers to extend.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Chuck Hagenbuch <chuck@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_source extends Horde_Mime_Viewer_Driver
-{
- /**
- * Add line numbers to a block of code.
- *
- * @param string $code The code to number.
- *
- * @return string The code with line numbers added.
- */
- protected function _lineNumber($code, $linebreak = "\n")
- {
- $html = array('<table class="lineNumbered" cellspacing="0"><tr><th>');
- for ($l = 1, $lines = substr_count($code, $linebreak) + 1; $l <= $lines; ++$l) {
- $html[] = sprintf('<a id="l%s" href="#l%s">%s</a><br />', $l, $l, $l);
- }
- return implode("\n", $html) . '</th><td><div>' . $code . '</div></td></tr></table>';
- }
-}
+++ /dev/null
-<?php
-
-require_once dirname(__FILE__) . '/source.php';
-
-/**
- * The Horde_Mime_Viewer_srchighlite class renders out various content in HTML
- * format by using Source-highlight.
- *
- * Source-highlight: http://www.gnu.org/software/src-highlite/
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_srchighlite extends Horde_Mime_Viewer_source
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
-
- // Need Horde headers for CSS tags.
- reset($ret);
- $ret[key($ret)]['data'] = Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
- $ret[key($ret)]['data'] .
- Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- /* Create temporary files for Webcpp. */
- $tmpin = Horde::getTempFile('SrcIn');
- $tmpout = Horde::getTempFile('SrcOut', false);
-
- /* Write the contents of our buffer to the temporary input file. */
- file_put_contents($tmpin, $this->_mimepart->getContents());
-
- /* Determine the language from the mime type. */
- $lang = $this->_typeToLang($this->_mimepart->getType());
-
- /* Execute Source-Highlite. */
- exec($this->_conf['location'] . " --src-lang $lang --out-format xhtml --input $tmpin --output $tmpout");
- $results = file_get_contents($tmpout);
- unlink($tmpout);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $this->_lineNumber($results),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Attempts to determine what mode to use for the source-highlight
- * program from a MIME type.
- *
- * @param string $type The MIME type.
- *
- * @return string The mode to use.
- */
- protected function _typeToLang($type)
- {
- switch ($type) {
- case 'text/x-java':
- return 'java';
-
- case 'text/x-csrc':
- case 'text/x-c++src':
- case 'text/cpp':
- return 'cpp';
-
- case 'application/x-perl':
- return 'perl';
-
- case 'application/x-php':
- case 'x-extension/phps':
- case 'x-extension/php3s':
- case 'application/x-httpd-php':
- case 'application/x-httpd-php3':
- case 'application/x-httpd-phps':
- return 'php3';
-
- case 'application/x-python':
- return 'python';
-
- // TODO: 'prolog', 'flex', 'changelog', 'ruby'
- }
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_tgz class renders out plain or gzipped tarballs in
- * HTML.
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Anil Madhavapeddy <anil@recoil.org>
- * @author Michael Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_tgz extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => false,
- 'info' => true,
- 'inline' => true
- );
-
- /**
- * The list of compressed subtypes.
- *
- * @var array
- */
- protected $_gzipSubtypes = array(
- 'x-compressed-tar', 'tgz', 'x-tgz', 'gzip', 'x-gzip',
- 'x-gzip-compressed', 'x-gtar'
- );
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- /* Currently, can't do anything without tar file. */
- $subtype = $this->_mimepart->getSubType();
- if (in_array($subtype, array('gzip', 'x-gzip', 'x-gzip-compressed'))) {
- return array();
- }
-
- $contents = $this->_mimepart->getContents();
-
- /* Decompress gzipped files. */
- if (in_array($subtype, $this->_gzipSubtypes)) {
- $gzip = &Horde_Compress::singleton('gzip');
- $contents = $gzip->decompress($contents);
- if (is_a($contents, 'PEAR_Error') || empty($contents)) {
- return array();
- }
- }
-
- /* Obtain the list of files/data in the tar file. */
- $tar = &Horde_Compress::singleton('tar');
- $tarData = $tar->decompress($contents);
- if (is_a($tarData, 'PEAR_Error')) {
- return array();
- }
- $fileCount = count($tarData);
-
- require_once 'Horde/Text.php';
-
- $name = $this->_mimepart->getName(true);
- if (empty($name)) {
- $name = _("unnamed");
- }
-
- $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
- '<table><tr><td align="left"><tt><span class="fixed">' .
- Text::htmlAllSpaces(_("Archive Name") . ': ' . $name) . "\n" .
- Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
- Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
- "\n\n" .
- Text::htmlAllSpaces(
- str_pad(_("File Name"), 62, ' ', STR_PAD_RIGHT) .
- str_pad(_("Attributes"), 15, ' ', STR_PAD_LEFT) .
- str_pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
- str_pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT)
- ) . "\n" .
- str_repeat('-', 106) . "\n";
-
- foreach ($tarData as $val) {
- $text .= Text::htmlAllSpaces(
- str_pad($val['name'], 62, ' ', STR_PAD_RIGHT) .
- str_pad($val['attr'], 15, ' ', STR_PAD_LEFT) .
- str_pad($val['size'], 10, ' ', STR_PAD_LEFT) .
- str_pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT)
- ) . "\n";
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * Return the rendered information about the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInfo()
- {
- return $this->_renderInline();
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_tnef class allows MS-TNEF attachments to be
- * displayed.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Jan Schneider <jan@horde.org>
- * @author Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_tnef extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
- if (!empty($ret)) {
- reset($ret);
- $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
- }
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- require_once 'Horde/Compress.php';
- $tnef = &Horde_Compress::singleton('tnef');
-
- $data = '<table border="1">';
- $info = $tnef->decompress($this->_mimepart->getContents());
- if (empty($info) || is_a($info, 'PEAR_Error')) {
- $data .= '<tr><td>' . _("MS-TNEF Attachment contained no data.") . '</td></tr>';
- } else {
- $data .= '<tr><td>' . _("Name") . '</td><td>' . _("Mime Type") . '</td></tr>';
- foreach ($info as $part) {
- $data .= '<tr><td>' . $part['name'] . '</td><td>' . $part['type'] . '/' . $part['subtype'] . '</td></tr>';
- }
- }
- $data .= '</table>';
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $data,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_vcard class renders out vCards in HTML format.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Jan Schneider <jan@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_vcard extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_renderInline();
- if (!empty($ret)) {
- reset($ret);
- $ret[key($ret)]['data'] = Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
- $ret[key($ret)]['data'] .
- Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
- }
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- global $registry, $prefs, $notification;
-
- $app = false;
- $data = $this->_mimepart->getContents();
- $html = '';
- $import_msg = null;
- $title = _("vCard");
-
- require_once 'Horde/iCalendar.php';
- $iCal = new Horde_iCalendar();
- if (!$iCal->parsevCalendar($data, 'VCALENDAR', $this->_mimepart->getCharset())) {
- $notification->push(_("There was an error reading the contact data."), 'horde.error');
- }
-
- if (Util::getFormData('import') &&
- Util::getFormData('source') &&
- $registry->hasMethod('contacts/import')) {
- $source = Util::getFormData('source');
- $count = 0;
- foreach ($iCal->getComponents() as $c) {
- if (is_a($c, 'Horde_iCalendar_vcard')) {
- $contacts = $registry->call('contacts/import',
- array($c, null, $source));
- if (is_a($contacts, 'PEAR_Error')) {
- $notification->push(
- _("There was an error importing the contact data:") . ' '
- . $contacts->getMessage(),
- 'horde.error');
- continue;
- }
- $count++;
- }
- }
- $notification->push(sprintf(ngettext(
- "%d contact was successfully added to your address book.",
- "%d contacts were successfully added to your address book.",
- $count),
- $count),
- 'horde.success');
- }
-
- $html .= '<table cellspacing="1" border="0" cellpadding="1">';
-
- $i = 0;
- foreach ($iCal->getComponents() as $vc) {
- if ($i > 0) {
- $html .= '<tr><td colspan="2"> </td></tr>';
- }
- ++$i;
-
- $html .= '<tr><td colspan="2" class="header">';
- $fullname = $vc->getAttributeDefault('FN', false);
- if ($fullname !== false) {
- $html .= $fullname;
- }
- $html .= '</td></tr>';
-
- $n = $vc->printableName();
- if (!empty($n)) {
- $html .= $this->_row(_("Name"), $n);
- }
-
- $aliases = $vc->getAttributeValues('ALIAS');
- if (!is_a($aliases, 'PEAR_Error')) {
- $html .= $this->_row(_("Alias"), implode("\n", $aliases));
- }
- $birthdays = $vc->getAttributeValues('BDAY');
- if (!is_a($birthdays, 'PEAR_Error')) {
- $birthday = new Horde_Date($birthdays[0]);
- $html .= $this->_row(
- _("Birthday"),
- $birthday->strftime($prefs->getValue('date_format')));
- }
-
- $photos = $vc->getAllAttributes('PHOTO');
- foreach ($photos as $photo) {
- if (!isset($photo['params']['VALUE']) ||
- String::upper($photo['params']['VALUE']) != 'URI') {
- continue;
- }
- $html .= $this->_row(_("Photo"),
- '<img src="' . htmlspecialchars($photo['value']) . '" />',
- false);
- }
-
- $labels = $vc->getAllAttributes('LABEL');
- foreach ($labels as $label) {
- if (isset($label['params']['TYPE'])) {
- if (!is_array($label['params']['TYPE'])) {
- $label['params']['TYPE'] = array($label['params']['TYPE']);
- }
- } else {
- $label['params']['TYPE'] = array_keys($label['params']);
- }
- $types = array();
- foreach ($label['params']['TYPE'] as $type) {
- switch(String::upper($type)) {
- case 'HOME':
- $types[] = _("Home Address");
- break;
-
- case 'WORK':
- $types[] = _("Work Address");
- break;
-
- case 'DOM':
- $types[] = _("Domestic Address");
- break;
-
- case 'INTL':
- $types[] = _("International Address");
- break;
-
- case 'POSTAL':
- $types[] = _("Postal Address");
- break;
-
- case 'PARCEL':
- $types[] = _("Parcel Address");
- break;
-
- case 'PREF':
- $types[] = _("Preferred Address");
- break;
- }
- }
- if (!count($types)) {
- $types = array(_("Address"));
- }
- $html .= $this->_row(implode('/', $types), $label['value']);
- }
-
- $adrs = $vc->getAllAttributes('ADR');
- foreach ($adrs as $item) {
- if (isset($item['params']['TYPE'])) {
- if (!is_array($item['params']['TYPE'])) {
- $item['params']['TYPE'] = array($item['params']['TYPE']);
- }
- } else {
- $item['params']['TYPE'] = array_keys($item['params']);
- }
- $address = $item['values'];
- $a = array();
- if (isset($address[VCARD_ADR_STREET])) {
- $a[] = $address[VCARD_ADR_STREET];
- }
- if (isset($address[VCARD_ADR_LOCALITY])) {
- $a[] = $address[VCARD_ADR_LOCALITY];
- }
- if (isset($address[VCARD_ADR_REGION])) {
- $a[] = $address[VCARD_ADR_REGION];
- }
- if (isset($address[VCARD_ADR_POSTCODE])) {
- $a[] = $address[VCARD_ADR_POSTCODE];
- }
- if (isset($address[VCARD_ADR_COUNTRY])) {
- $a[] = $address[VCARD_ADR_COUNTRY];
- }
- $types = array();
- foreach ($item['params']['TYPE'] as $type) {
- switch(String::upper($type)) {
- case 'HOME':
- $types[] = _("Home Address");
- break;
-
- case 'WORK':
- $types[] = _("Work Address");
- break;
-
- case 'DOM':
- $types[] = _("Domestic Address");
- break;
-
- case 'INTL':
- $types[] = _("International Address");
- break;
-
- case 'POSTAL':
- $types[] = _("Postal Address");
- break;
-
- case 'PARCEL':
- $types[] = _("Parcel Address");
- break;
-
- case 'PREF':
- $types[] = _("Preferred Address");
- break;
- }
- }
- if (!count($types)) {
- $types = array(_("Address"));
- }
- $html .= $this->_row(implode('/', $types), implode("\n", $a));
- }
-
- $numbers = $vc->getAllAttributes('TEL');
-
- foreach ($numbers as $number) {
- if (isset($number['params']['TYPE'])) {
- if (!is_array($number['params']['TYPE'])) {
- $number['params']['TYPE'] = array($number['params']['TYPE']);
- }
- foreach ($number['params']['TYPE'] as $type) {
- $number['params'][String::upper($type)] = true;
- }
- }
- if (isset($number['params']['FAX'])) {
- $html .= $this->_row(_("Fax"), $number['value']);
- } else {
- if (isset($number['params']['HOME'])) {
- $html .= $this->_row(_("Home Phone"),
- $number['value']);
- } elseif (isset($number['params']['WORK'])) {
- $html .= $this->_row(_("Work Phone"),
- $number['value']);
- } elseif (isset($number['params']['CELL'])) {
- $html .= $this->_row(_("Cell Phone"),
- $number['value']);
- } else {
- $html .= $this->_row(_("Phone"),
- $number['value']);
- }
- }
- }
-
- $addresses = $vc->getAllAttributes('EMAIL');
- $emails = array();
- foreach ($addresses as $address) {
- if (isset($address['params']['TYPE'])) {
- if (!is_array($address['params']['TYPE'])) {
- $address['params']['TYPE'] = array($address['params']['TYPE']);
- }
- foreach ($address['params']['TYPE'] as $type) {
- $address['params'][String::upper($type)] = true;
- }
- }
- $email = '<a href="';
- if ($registry->hasMethod('mail/compose')) {
- $email .= $registry->call(
- 'mail/compose',
- array(array('to' => $address['value'])));
- } else {
- $email .= 'mailto:' . htmlspecialchars($address['value']);
- }
- $email .= '">' . htmlspecialchars($address['value']) . '</a>';
- if (isset($address['params']['PREF'])) {
- array_unshift($emails, $email);
- } else {
- $emails[] = $email;
- }
- }
-
- if (count($emails)) {
- $html .= $this->_row(_("Email"), implode("\n", $emails), false);
- }
-
- $title = $vc->getAttributeValues('TITLE');
- if (!is_a($title, 'PEAR_Error')) {
- $html .= $this->_row(_("Title"), $title[0]);
- }
-
- $role = $vc->getAttributeValues('ROLE');
- if (!is_a($role, 'PEAR_Error')) {
- $html .= $this->_row(_("Role"), $role[0]);
- }
-
- $org = $vc->getAttributeValues('ORG');
- if (!is_a($org, 'PEAR_Error')) {
- $html .= $this->_row(_("Company"), $org[0]);
- if (isset($org[1])) {
- $html .= $this->_row(_("Department"), $org[1]);
- }
- }
-
- $notes = $vc->getAttributeValues('NOTE');
- if (!is_a($notes, 'PEAR_Error')) {
- $html .= $this->_row(_("Notes"), $notes[0]);
- }
-
- $url = $vc->getAttributeValues('URL');
- if (!is_a($url, 'PEAR_Error')) {
- $html .= $this->_row(
- _("URL"),
- '<a href="' . htmlspecialchars($url[0])
- . '" target="_blank">' . htmlspecialchars($url[0])
- . '</a>',
- false);
- }
- }
-
- if ($registry->hasMethod('contacts/import') &&
- $registry->hasMethod('contacts/sources')) {
- $html .= '<tr><td colspan="2" class="smallheader"><form action="'
- . Horde::selfUrl() . '" method="get" name="vcard_import">'
- . Util::formInput();
- foreach ($_GET as $key => $val) {
- $html .= '<input type="hidden" name="' . htmlspecialchars($key)
- . '" value="' . htmlspecialchars($val) . '" />';
- }
-
- $sources = $registry->call('contacts/sources', array(true));
- if (count($sources) > 1) {
- $html .=
- '<input type="submit" class="button" name="import" value="'
- . _("Add to address book:") . '" />'
- . '<label for="add_source" class="hidden">'
- . _("Address Book") . '</label>'
- . '<select id="add_source" name="source">';
- foreach ($sources as $key => $label) {
- $selected = ($key == $prefs->getValue('add_source'))
- ? ' selected="selected"' : '';
- $html .= '<option value="' . htmlspecialchars($key) . '"'
- . $selected . '>' . htmlspecialchars($label)
- . '</option>';
- }
- } else {
- reset($sources);
- $html .=
- '<input type="submit" class="button" name="import" value="'
- . _("Add to my address book") . '" />'
- . '<input type="hidden" name="source" value="'
- . htmlspecialchars(key($sources)) . '" />';
- }
-
- $html .= '</form></td></tr><tr><td> </td></tr>';
- }
-
- $html .= '</table>';
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status')) . $html,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-
- /**
- * TODO
- */
- protected function _row($label, $value, $encode = true)
- {
- if ($encode) {
- $label = htmlspecialchars($label);
- $value = htmlspecialchars($value);
- }
- return '<tr><td class="item" valign="top">' . $label .
- '</td><td class="item" valign="top">' . nl2br($value) .
- "</td></tr>\n";
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_webcpp class renders out various content in HTML
- * format by using Web C Plus Plus.
- *
- * Web C Plus plus: http://webcpp.sourceforge.net/
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_webcpp extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_toHTML();
-
- /* The first 2 lines are the Content-Type line and a blank line so
- * remove them before outputting. */
- reset($ret);
- $ret[key($ret)]['data'] = preg_replace("/.*\n.*\n/", '', $ret[key($ret)]['data'], 1);
-
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- $ret = $this->_toHTML();
- reset($ret);
- $data = $ret[key($ret)]['data'];
-
- /* Extract the style sheet, removing any global body formatting
- * if we're displaying inline. */
- $res = preg_split(';(</style>)|(<style type="text/css">);', $data);
- $style = $res[1];
- $style = preg_replace('/\nbody\s+?{.*?}/s', '', $style);
-
- /* Extract the content. */
- $res = preg_split('/\<\/?pre\>/', $data);
- $body = $res[1];
-
- $ret[key($ret)]['data'] = '<style>' . $style . '</style><div class="webcpp" style="white-space:pre;font-family:Lucida Console,Courier,monospace;">' . $body . '</div>';
-
- return $ret;
- }
-
- /**
- * Converts the code to HTML.
- *
- * @return string The HTML-ified version of the MIME part contents.
- */
- protected function _toHTML()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- /* Create temporary files for Webcpp. */
- $tmpin = Horde::getTempFile('WebcppIn');
- $tmpout = Horde::getTempFile('WebcppOut');
-
- /* Write the contents of our buffer to the temporary input file. */
- file_put_contents($tmpin, $this->_mimepart->getContents());
-
- /* Get the extension for the mime type. */
- include_once dirname(__FILE__) . '/../Magic.php';
- $ext = Horde_Mime_Magic::MIMEToExt($this->_mimepart->getType());
-
- /* Execute Web C Plus Plus. Specifying the in and out files didn't
- * work for me but pipes did. */
- exec($this->_conf['location'] . " --pipe --pipe -x=$ext -l -a -t < $tmpin > $tmpout");
- $results = file_get_contents($tmpout);
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $results,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_wordperfect class renders out WordPerfect documents
- * in HTML format by using the libwpd package.
- *
- * libpwd website: http://libwpd.sourceforge.net/
- *
- * Copyright 2007-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Matt Selsky <selsky@columbia.edu>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_wordperfect extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => false,
- 'full' => true,
- 'info' => false,
- 'inline' => false
- );
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- /* Check to make sure the viewer program exists. */
- if (!isset($this->_conf['location']) ||
- !file_exists($this->_conf['location'])) {
- return array();
- }
-
- $tmp_wpd = Horde::getTempFile('wpd');
- $tmp_output = Horde::getTempFile('wpd');
-
- file_put_contents($tmp_wpd, $this->_mimepart->getContents());
-
- exec($this->_conf['location'] . " $tmp_wpd > $tmp_output");
-
- if (file_exists($tmp_output)) {
- $data = file_get_contents($tmp_output);
- } else {
- $data = _("Unable to translate this WordPerfect document");
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => $data,
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * The Horde_Mime_Viewer_zip class renders out the contents of ZIP files in
- * HTML format.
- *
- * Copyright 2000-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author Chuck Hagenbuch <chuck@horde.org>
- * @author Michael Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_zip extends Horde_Mime_Viewer_Driver
-{
- /**
- * Can this driver render various views?
- *
- * @var boolean
- */
- protected $_capability = array(
- 'embedded' => false,
- 'forceinline' => true,
- 'full' => true,
- 'info' => false,
- 'inline' => true
- );
-
- /**
- * A callback function to use in _toHTML().
- *
- * @var callback
- */
- protected $_callback = null;
-
- /**
- * Return the full rendered version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _render()
- {
- $ret = $this->_toHTML();
- if (!empty($ret)) {
- reset($ret);
- $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
- }
- return $ret;
- }
-
- /**
- * Return the rendered inline version of the Horde_Mime_Part object.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _renderInline()
- {
- return $this->_toHTML();
- }
-
- /**
- * Converts the ZIP file to an HTML display.
- *
- * @return array See Horde_Mime_Viewer_Driver::render().
- */
- protected function _toHTML()
- {
- $contents = $this->_mimepart->getContents();
-
- require_once 'Horde/Compress.php';
- $zip = &Horde_Compress::singleton('zip');
-
- /* Make sure this is a valid zip file. */
- if ($zip->checkZipData($contents) === false) {
- return array();
- }
-
- $zipInfo = $zip->decompress($contents, array('action' => HORDE_COMPRESS_ZIP_LIST));
- if (is_a($zipInfo, 'PEAR_Error')) {
- return array();
- }
- $fileCount = count($zipInfo);
-
- /* Determine maximum file name length. */
- $max_array = array();
- foreach ($zipInfo as $val) {
- $max_array[] = strlen($val['name']);
- }
- $maxlen = empty($max_array) ? 0 : max($max_array);
-
- require_once 'Horde/Text.php';
-
- $name = $this->_mimepart->getName(true);
- if (empty($name)) {
- $name = _("unnamed");
- }
-
- $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
- '<table><tr><td align="left"><tt><span class="fixed">' .
- Text::htmlAllSpaces(
- _("Archive Name") . ': ' . $name . "\n" .
- _("Archive File Size") . ': ' . strlen($contents) .
- ' bytes' . "\n" .
- sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount) .
- "\n\n" .
- String::pad(_("File Name"), $maxlen, ' ', STR_PAD_RIGHT) .
- String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
- String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("CRC"), 10, ' ', STR_PAD_LEFT) .
- String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT) .
- "\n"
- ) . str_repeat('-', 69 + $maxlen) . "\n";
-
- foreach ($zipInfo as $key => $val) {
- $ratio = (empty($val['size']))
- ? 0
- : 100 * ($val['csize'] / $val['size']);
-
- $val['name'] = String::pad($val['name'], $maxlen, ' ', STR_PAD_RIGHT);
- $val['attr'] = String::pad($val['attr'], 10,' ', STR_PAD_LEFT);
- $val['size'] = String::pad($val['size'], 10, ' ', STR_PAD_LEFT);
- $val['date'] = String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT);
- $val['method'] = String::pad($val['method'], 10, ' ', STR_PAD_LEFT);
- $val['crc'] = String::pad($val['crc'], 10, ' ', STR_PAD_LEFT);
- $val['ratio'] = String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT);
-
- $val = array_map(array('Text', 'htmlAllSpaces'), $val);
- if (!is_null($this->_callback)) {
- $val = call_user_func($this->_callback, $key, $val);
- }
-
- $text .= $val['name'] . $val['attr'] . $val['size'] .
- $val['date'] . $val['method'] . $val['crc'] . $val['ratio'] .
- "\n";
- }
-
- return array(
- $this->_mimepart->getMimeId() => array(
- 'data' => nl2br($text . str_repeat('-', 69 + $maxlen) . "\n" . '</span></tt></td></tr></table>'),
- 'status' => array(),
- 'type' => 'text/html; charset=' . NLS::getCharset()
- )
- );
- }
-}
<dir name="Horde">
<dir name="Mime">
<dir name="Viewer">
- <dir name="ooo">
+ <dir name="Ooo">
<file name="common.xsl" role="php" />
<file name="global_document.xsl" role="php" />
<file name="main_html.xsl" role="php" />
<file name="table_cells.xsl" role="php" />
<file name="table_columns.xsl" role="php" />
<file name="table_rows.xsl" role="php" />
- </dir> <!-- /lib/Horde/Mime/Viewer/ooo -->
+ </dir> <!-- /lib/Horde/Mime/Viewer/Ooo -->
+ <file name="Audio.php" role="php" />
+ <file name="Css.php" role="php" />
+ <file name="Deb.php" role="php" />
+ <file name="Default.php" role="php" />
<file name="Driver.php" role="php" />
- <file name="audio.php" role="php" />
- <file name="css.php" role="php" />
- <file name="deb.php" role="php" />
- <file name="default.php" role="php" />
- <file name="enriched.php" role="php" />
- <file name="enscript.php" role="php" />
- <file name="html.php" role="php" />
- <file name="images.php" role="php" />
- <file name="msexcel.php" role="php" />
- <file name="mspowerpoint.php" role="php" />
- <file name="msword.php" role="php" />
- <file name="ooo.php" role="php" />
- <file name="pdf.php" role="php" />
- <file name="php.php" role="php" />
- <file name="plain.php" role="php" />
- <file name="rar.php" role="php" />
- <file name="report.php" role="php" />
- <file name="rfc822.php" role="php" />
- <file name="richtext.php" role="php" />
- <file name="rpm.php" role="php" />
- <file name="rtf.php" role="php" />
- <file name="security.php" role="php" />
- <file name="simple.php" role="php" />
- <file name="smil.php" role="php" />
- <file name="source.php" role="php" />
- <file name="srchighlite.php" role="php" />
- <file name="tgz.php" role="php" />
- <file name="tnef.php" role="php" />
- <file name="vcard.php" role="php" />
- <file name="webcpp.php" role="php" />
- <file name="wordperfect.php" role="php" />
- <file name="zip.php" role="php" />
+ <file name="Enriched.php" role="php" />
+ <file name="Enscript.php" role="php" />
+ <file name="Html.php" role="php" />
+ <file name="Images.php" role="php" />
+ <file name="Msexcel.php" role="php" />
+ <file name="Mspowerpoint.php" role="php" />
+ <file name="Msword.php" role="php" />
+ <file name="Ooo.php" role="php" />
+ <file name="Pdf.php" role="php" />
+ <file name="Php.php" role="php" />
+ <file name="Plain.php" role="php" />
+ <file name="Rar.php" role="php" />
+ <file name="Report.php" role="php" />
+ <file name="Rfc822.php" role="php" />
+ <file name="Richtext.php" role="php" />
+ <file name="Rpm.php" role="php" />
+ <file name="Rtf.php" role="php" />
+ <file name="Security.php" role="php" />
+ <file name="Simple.php" role="php" />
+ <file name="Smil.php" role="php" />
+ <file name="Source.php" role="php" />
+ <file name="Srchighlite.php" role="php" />
+ <file name="Tgz.php" role="php" />
+ <file name="Tnef.php" role="php" />
+ <file name="Vcard.php" role="php" />
+ <file name="Webcpp.php" role="php" />
+ <file name="Wordperfect.php" role="php" />
+ <file name="Zip.php" role="php" />
</dir> <!-- /lib/Horde/Mime/Viewer -->
<file name="Address.php" role="php" />
<file name="Exception.php" role="php" />
<channel>pecl.php.net</channel>
</package>
<package>
- <name>Auth</name>
- <channel>pear.horde.org</channel>
- </package>
- <package>
<name>Horde_Browser</name>
<channel>pear.horde.org</channel>
</package>
<channel>pear.horde.org</channel>
</package>
<package>
- <name>Horde_SessionObjects</name>
- <channel>pear.horde.org</channel>
- </package>
- <package>
<name>Horde_Text_Filter</name>
<channel>pear.horde.org</channel>
</package>
<install name="lib/Horde/Mime/Viewer/ooo/table_cells.xsl" as="Horde/Mime/Viewer/ooo/table_cells.xsl" />
<install name="lib/Horde/Mime/Viewer/ooo/table_columns.xsl" as="Horde/Mime/Viewer/ooo/table_columns.xsl" />
<install name="lib/Horde/Mime/Viewer/ooo/table_rows.xsl" as="Horde/Mime/Viewer/ooo/table_rows.xsl" />
+ <install name="lib/Horde/Mime/Viewer/Audio.php" as="Horde/Mime/Viewer/Audio.php" />
+ <install name="lib/Horde/Mime/Viewer/Css.php" as="Horde/Mime/Viewer/Css.php" />
+ <install name="lib/Horde/Mime/Viewer/Deb.php" as="Horde/Mime/Viewer/Deb.php" />
+ <install name="lib/Horde/Mime/Viewer/Default.php" as="Horde/Mime/Viewer/Default.php" />
<install name="lib/Horde/Mime/Viewer/Driver.php" as="Horde/Mime/Viewer/Driver.php" />
- <install name="lib/Horde/Mime/Viewer/audio.php" as="Horde/Mime/Viewer/audio.php" />
- <install name="lib/Horde/Mime/Viewer/css.php" as="Horde/Mime/Viewer/css.php" />
- <install name="lib/Horde/Mime/Viewer/deb.php" as="Horde/Mime/Viewer/deb.php" />
- <install name="lib/Horde/Mime/Viewer/default.php" as="Horde/Mime/Viewer/default.php" />
- <install name="lib/Horde/Mime/Viewer/enriched.php" as="Horde/Mime/Viewer/enriched.php" />
- <install name="lib/Horde/Mime/Viewer/enscript.php" as="Horde/Mime/Viewer/enscript.php" />
- <install name="lib/Horde/Mime/Viewer/html.php" as="Horde/Mime/Viewer/html.php" />
- <install name="lib/Horde/Mime/Viewer/images.php" as="Horde/Mime/Viewer/images.php" />
- <install name="lib/Horde/Mime/Viewer/msexcel.php" as="Horde/Mime/Viewer/msexcel.php" />
- <install name="lib/Horde/Mime/Viewer/mspowerpoint.php" as="Horde/Mime/Viewer/mspowerpoint.php" />
- <install name="lib/Horde/Mime/Viewer/msword.php" as="Horde/Mime/Viewer/msword.php" />
- <install name="lib/Horde/Mime/Viewer/ooo.php" as="Horde/Mime/Viewer/ooo.php" />
- <install name="lib/Horde/Mime/Viewer/pdf.php" as="Horde/Mime/Viewer/pdf.php" />
- <install name="lib/Horde/Mime/Viewer/php.php" as="Horde/Mime/Viewer/php.php" />
- <install name="lib/Horde/Mime/Viewer/plain.php" as="Horde/Mime/Viewer/plain.php" />
- <install name="lib/Horde/Mime/Viewer/rar.php" as="Horde/Mime/Viewer/rar.php" />
- <install name="lib/Horde/Mime/Viewer/report.php" as="Horde/Mime/Viewer/report.php" />
- <install name="lib/Horde/Mime/Viewer/rfc822.php" as="Horde/Mime/Viewer/rfc822.php" />
- <install name="lib/Horde/Mime/Viewer/richtext.php" as="Horde/Mime/Viewer/richtext.php" />
- <install name="lib/Horde/Mime/Viewer/rpm.php" as="Horde/Mime/Viewer/rpm.php" />
- <install name="lib/Horde/Mime/Viewer/rtf.php" as="Horde/Mime/Viewer/rtf.php" />
- <install name="lib/Horde/Mime/Viewer/security.php" as="Horde/Mime/Viewer/security.php" />
- <install name="lib/Horde/Mime/Viewer/simple.php" as="Horde/Mime/Viewer/simple.php" />
- <install name="lib/Horde/Mime/Viewer/smil.php" as="Horde/Mime/Viewer/smil.php" />
- <install name="lib/Horde/Mime/Viewer/source.php" as="Horde/Mime/Viewer/source.php" />
- <install name="lib/Horde/Mime/Viewer/srchighlite.php" as="Horde/Mime/Viewer/srchighlite.php" />
- <install name="lib/Horde/Mime/Viewer/tgz.php" as="Horde/Mime/Viewer/tgz.php" />
- <install name="lib/Horde/Mime/Viewer/tnef.php" as="Horde/Mime/Viewer/tnef.php" />
- <install name="lib/Horde/Mime/Viewer/vcard.php" as="Horde/Mime/Viewer/vcard.php" />
- <install name="lib/Horde/Mime/Viewer/webcpp.php" as="Horde/Mime/Viewer/webcpp.php" />
- <install name="lib/Horde/Mime/Viewer/wordperfect.php" as="Horde/Mime/Viewer/wordperfect.php" />
- <install name="lib/Horde/Mime/Viewer/zip.php" as="Horde/Mime/Viewer/zip.php" />
+ <install name="lib/Horde/Mime/Viewer/Enriched.php" as="Horde/Mime/Viewer/Enriched.php" />
+ <install name="lib/Horde/Mime/Viewer/Enscript.php" as="Horde/Mime/Viewer/Enscript.php" />
+ <install name="lib/Horde/Mime/Viewer/Html.php" as="Horde/Mime/Viewer/Html.php" />
+ <install name="lib/Horde/Mime/Viewer/Images.php" as="Horde/Mime/Viewer/Images.php" />
+ <install name="lib/Horde/Mime/Viewer/Msexcel.php" as="Horde/Mime/Viewer/Msexcel.php" />
+ <install name="lib/Horde/Mime/Viewer/Mspowerpoint.php" as="Horde/Mime/Viewer/Mspowerpoint.php" />
+ <install name="lib/Horde/Mime/Viewer/Msword.php" as="Horde/Mime/Viewer/Msword.php" />
+ <install name="lib/Horde/Mime/Viewer/Ooo.php" as="Horde/Mime/Viewer/Ooo.php" />
+ <install name="lib/Horde/Mime/Viewer/Pdf.php" as="Horde/Mime/Viewer/Pdf.php" />
+ <install name="lib/Horde/Mime/Viewer/Php.php" as="Horde/Mime/Viewer/Php.php" />
+ <install name="lib/Horde/Mime/Viewer/Plain.php" as="Horde/Mime/Viewer/Plain.php" />
+ <install name="lib/Horde/Mime/Viewer/Rar.php" as="Horde/Mime/Viewer/Rar.php" />
+ <install name="lib/Horde/Mime/Viewer/Report.php" as="Horde/Mime/Viewer/Report.php" />
+ <install name="lib/Horde/Mime/Viewer/Rfc822.php" as="Horde/Mime/Viewer/Rfc822.php" />
+ <install name="lib/Horde/Mime/Viewer/Richtext.php" as="Horde/Mime/Viewer/Richtext.php" />
+ <install name="lib/Horde/Mime/Viewer/Rpm.php" as="Horde/Mime/Viewer/Rpm.php" />
+ <install name="lib/Horde/Mime/Viewer/Rtf.php" as="Horde/Mime/Viewer/Rtf.php" />
+ <install name="lib/Horde/Mime/Viewer/Security.php" as="Horde/Mime/Viewer/Security.php" />
+ <install name="lib/Horde/Mime/Viewer/Simple.php" as="Horde/Mime/Viewer/Simple.php" />
+ <install name="lib/Horde/Mime/Viewer/Smil.php" as="Horde/Mime/Viewer/Smil.php" />
+ <install name="lib/Horde/Mime/Viewer/Source.php" as="Horde/Mime/Viewer/Source.php" />
+ <install name="lib/Horde/Mime/Viewer/Srchighlite.php" as="Horde/Mime/Viewer/Srchighlite.php" />
+ <install name="lib/Horde/Mime/Viewer/Tgz.php" as="Horde/Mime/Viewer/Tgz.php" />
+ <install name="lib/Horde/Mime/Viewer/Tnef.php" as="Horde/Mime/Viewer/Tnef.php" />
+ <install name="lib/Horde/Mime/Viewer/Vcard.php" as="Horde/Mime/Viewer/Vcard.php" />
+ <install name="lib/Horde/Mime/Viewer/Webcpp.php" as="Horde/Mime/Viewer/Webcpp.php" />
+ <install name="lib/Horde/Mime/Viewer/Wordperfect.php" as="Horde/Mime/Viewer/Wordperfect.php" />
+ <install name="lib/Horde/Mime/Viewer/Zip.php" as="Horde/Mime/Viewer/Zip.php" />
<install name="lib/Horde/Mime/Address.php" as="Horde/Mime/Address.php" />
<install name="lib/Horde/Mime/Exception.php" as="Horde/Mime/Exception.php" />
<install name="lib/Horde/Mime/Headers.php" as="Horde/Mime/Headers.php" />