163 lines
3.6 KiB
PHP
163 lines
3.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @defgroup search Search
|
|
* Implements search tools, such as file parsers, workflow integration,
|
|
* indexing, querying, etc.
|
|
*/
|
|
|
|
/**
|
|
* @file classes/search/SearchFileParser.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class SearchFileParser
|
|
*
|
|
* @ingroup search
|
|
*
|
|
* @brief Abstract class to extract search text from a given file.
|
|
*/
|
|
|
|
namespace PKP\search;
|
|
|
|
use Exception;
|
|
use PKP\config\Config;
|
|
use PKP\submissionFile\SubmissionFile;
|
|
|
|
class SearchFileParser
|
|
{
|
|
/** @var string the complete path to the file */
|
|
public $filePath;
|
|
|
|
/** @var resource file handle */
|
|
public $fp;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param string $filePath
|
|
*/
|
|
public function __construct($filePath)
|
|
{
|
|
$this->filePath = $filePath;
|
|
}
|
|
|
|
/**
|
|
* Return the path to the file.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getFilePath()
|
|
{
|
|
return $this->filePath;
|
|
}
|
|
|
|
/**
|
|
* Change the file path.
|
|
*
|
|
* @param string $filePath
|
|
*/
|
|
public function setFilePath($filePath)
|
|
{
|
|
$this->filePath = $filePath;
|
|
}
|
|
|
|
/**
|
|
* Open the file.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function open()
|
|
{
|
|
if (!($this->fp = @fopen($this->filePath, 'rb'))) {
|
|
throw new Exception("Failed to parse the file \"{$this->filePath}\". Last error: " . error_get_last());
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Close the file.
|
|
*/
|
|
public function close()
|
|
{
|
|
if ($this->fp) {
|
|
fclose($this->fp);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Read and return the next block/line of text.
|
|
*
|
|
* @return string (false on EOF)
|
|
*/
|
|
public function read()
|
|
{
|
|
if (!$this->fp || feof($this->fp)) {
|
|
return false;
|
|
}
|
|
return $this->doRead();
|
|
}
|
|
|
|
/**
|
|
* Read from the file pointer.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function doRead()
|
|
{
|
|
return fgets($this->fp);
|
|
}
|
|
|
|
|
|
//
|
|
// Static methods
|
|
//
|
|
|
|
/**
|
|
* Create a text parser for a file.
|
|
*
|
|
* @param SubmissionFile $submissionFile
|
|
*
|
|
* @return ?SearchFileParser
|
|
*/
|
|
public static function fromFile($submissionFile)
|
|
{
|
|
$fullPath = rtrim(Config::getVar('files', 'files_dir'), '/') . '/' . $submissionFile->getData('path');
|
|
return static::fromFileType($submissionFile->getData('mimetype'), $fullPath);
|
|
}
|
|
|
|
/**
|
|
* Create a text parser for a file.
|
|
*
|
|
* @param string $type
|
|
* @param string $path
|
|
*
|
|
* @return ?SearchFileParser
|
|
*/
|
|
public static function fromFileType($type, $path)
|
|
{
|
|
if (Config::getVar('search', "index[{$type}]")) {
|
|
$parserType = 'process';
|
|
} else {
|
|
// If an indexer definition exists, but its value is falsy, we assume the user wants to disable the default handler
|
|
$parserType = Config::hasVar('search', "index[{$type}]") ? 'disabled' : $type;
|
|
}
|
|
return match ($parserType) {
|
|
// External process
|
|
'process' => new SearchHelperParser($type, $path),
|
|
// Text processor
|
|
'text/plain' => new static($path),
|
|
// HTML/XML processor
|
|
'text/html', 'text/xml', 'application/xhtml', 'application/xml' => new SearchHTMLParser($path),
|
|
// Disabled/no suitable parser
|
|
default => null
|
|
};
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\PKP\search\SearchFileParser', '\SearchFileParser');
|
|
}
|