<?php
/*
application_vnd_oasis_opendocument_DocumentHandler.php, handler for
OpenDocument documents
Copyright (C) 2005 Arend van Beelen, Auton Rijnsburg
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
For any questions, comments or whatever, you may mail me at: hide@address.com
*/
require_once('Document.php');
require_once('DocumentHandler.php');
require_once('OpenDocument.php');
require_once('String.php');
require_once('URI.php');
class application_vnd_oasis_opendocument_DocumentHandler extends DocumentHandler
{
public static function view(Container $parent, $uri)
{
$tmpdir = URI::uniquePath('tmp://', 'DocumentViewer');
URI::mkdir($tmpdir);
$tmpuri = "$tmpdir/content.html";
$openDocument = new OpenDocument();
if($openDocument->load($uri) == false)
{
new Paragraph($parent, i18n('The document could not be opened.'));
return;
}
if($openDocument->convertToXHTML($tmpuri) == false)
{
new Paragraph($parent, i18n('The document could not be converted.'));
return;
}
//new DocumentViewer($parent, $tmpuri, 'text/html');
$lines = URI::file($tmpuri);
if($lines === false)
{
$lines = array();
}
$contents = '';
$inBody = false;
foreach($lines as $line)
{
if($inBody == false)
{
if(strstr($line, '<body>') !== false)
{
$inBody = true;
if(strstr($line, '</body>') !== false)
{
$inBody = false;
$line = String::substringBefore($line, '</body>');
}
$contents .= String::substringAfter($line, '<body>');
}
}
else
{
if(strstr($line, '</body>') !== false)
{
$inBody = false;
$contents .= String::substringBefore($line, '</body>');
}
else if(ctype_space($line) != true)
{
$contents .= $line;
}
}
}
new RawWidget($parent, "<htmlblock xmlns=\"http://www.w3.org/1999/xhtml\">$contents</htmlblock>");
}
public static function supportsIndexing()
{
return true;
}
public static function index($documentId, $uri)
{
$openDocument = new OpenDocument();
if($openDocument->load($uri) == false)
{
return;
}
$search = Search::instance();
$search->indexText($documentId, $openDocument->title(), 40);
$search->indexText($documentId, $openDocument->subject(), 30);
$search->indexText($documentId, $openDocument->keywords(), 40);
$search->indexText($documentId, $openDocument->comments(), 30);
$search->indexText($documentId, $openDocument->author(), 20);
$doc = new DOMDocument();
if($doc->load($openDocument->temporaryDirectory().'/content.xml') == false)
{
return;
}
self::indexNode($documentId, $doc->firstChild);
}
private static function indexNode($documentId, $node, $weight = 1)
{
while($node)
{
if($node instanceof DOMText)
{
$search = Search::instance();
$search->indexText($documentId, $node->nodeValue, $weight);
}
else
{
if($node->localName == 'h' &&
$node->namespaceURI == 'urn:oasis:names:tc:opendocument:xmlns:text:1.0')
{
$weight = 20;
}
self::indexNode($documentId, $node->firstChild, $weight);
}
$node = $node->nextSibling;
}
}
}
?>