Open Monograph Press  3.3.0
HtmlMonographFilePlugin.inc.php
1 <?php
2 
16 import('lib.pkp.classes.plugins.GenericPlugin');
17 
22  function register($category, $path, $mainContextId = null) {
23  if (parent::register($category, $path, $mainContextId)) {
24  if ($this->getEnabled($mainContextId)) {
25  HookRegistry::register('CatalogBookHandler::view', array($this, 'viewCallback'));
26  HookRegistry::register('CatalogBookHandler::download', array($this, 'downloadCallback'));
27  }
28  return true;
29  }
30  return false;
31  }
32 
38  return $this->getPluginPath() . '/settings.xml';
39  }
40 
45  function getDisplayName() {
46  return __('plugins.generic.htmlMonographFile.displayName');
47  }
48 
52  function getDescription() {
53  return __('plugins.generic.htmlMonographFile.description');
54  }
55 
62  function viewCallback($hookName, $params) {
63  $submission =& $params[1];
64  $publicationFormat =& $params[2];
65  $submissionFile =& $params[3];
66  $inline =& $params[4];
67  $request = Application::get()->getRequest();
68 
69  if ($submissionFile && $submissionFile->getFileType() == 'text/html') {
70  foreach ($submission->getData('publications') as $publication) {
71  if ($publication->getId() === $publicationFormat->getData('publicationId')) {
72  $filePublication = $publication;
73  break;
74  }
75  }
76  $templateMgr = TemplateManager::getManager($request);
77  $templateMgr->assign(array(
78  'pluginUrl' => $request->getBaseUrl() . '/' . $this->getPluginPath(),
79  'monograph' => $submission,
80  'publicationFormat' => $publicationFormat,
81  'downloadFile' => $submissionFile,
82  'isLatestPublication' => $submission->getData('currentPublicationId') === $publicationFormat->getData('publicationId'),
83  'filePublication' => $filePublication,
84  ));
85  $templateMgr->display($this->getTemplateResource('display.tpl'));
86  return true;
87  }
88 
89  return false;
90  }
91 
97  function downloadCallback($hookName, $params) {
98  $submission =& $params[1];
99  $publicationFormat =& $params[2];
100  $submissionFile =& $params[3];
101  $inline =& $params[4];
102  $request = Application::get()->getRequest();
103 
104  if ($submissionFile && $submissionFile->getFileType() == 'text/html') {
105  if (!HookRegistry::call('HtmlMonographFilePlugin::monographDownload', array(&$this, &$submission, &$publicationFormat, &$submissionFile, &$inline))) {
106  echo $this->_getHTMLContents($request, $submission, $publicationFormat, $submissionFile);
107  $returner = true;
108  HookRegistry::call('HtmlMonographFilePlugin::monographDownloadFinished', array(&$returner));
109  return true;
110  }
111  }
112 
113  return false;
114  }
124  function _getHTMLContents($request, $monograph, $publicationFormat, $submissionFile) {
125  $contents = file_get_contents($submissionFile->getFilePath());
126 
127  // Replace media file references
128  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
129  import('lib.pkp.classes.submission.SubmissionFile'); // Constants
130  $embeddableFiles = array_merge(
131  $submissionFileDao->getLatestRevisions($submissionFile->getSubmissionId(), SUBMISSION_FILE_PROOF),
132  $submissionFileDao->getLatestRevisionsByAssocId(ASSOC_TYPE_SUBMISSION_FILE, $submissionFile->getFileId(), $submissionFile->getSubmissionId(), SUBMISSION_FILE_DEPENDENT)
133  );
134 
135  foreach ($embeddableFiles as $embeddableFile) {
136  $fileUrl = $request->url(null, 'catalog', 'download', array($monograph->getBestId(), $publicationFormat->getBestId(), $embeddableFile->getBestId()), array('inline' => true));
137  $pattern = preg_quote($embeddableFile->getOriginalFileName());
138 
139  $contents = preg_replace(
140  '/([Ss][Rr][Cc]|[Hh][Rr][Ee][Ff]|[Dd][Aa][Tt][Aa])\s*=\s*"([^"]*' . $pattern . ')"/',
141  '\1="' . $fileUrl . '"',
142  $contents
143  );
144 
145  // Replacement for Flowplayer
146  $contents = preg_replace(
147  '/[Uu][Rr][Ll]\s*\:\s*\'(' . $pattern . ')\'/',
148  'url:\'' . $fileUrl . '\'',
149  $contents
150  );
151 
152  // Replacement for other players (tested with odeo; yahoo and google player won't work w/ OJS URLs, might work for others)
153  $contents = preg_replace(
154  '/[Uu][Rr][Ll]=([^"]*' . $pattern . ')/',
155  'url=' . $fileUrl ,
156  $contents
157  );
158 
159  }
160 
161  // Perform replacement for ojs://... URLs
162  $contents = preg_replace_callback(
163  '/(<[^<>]*")[Oo][Mm][Pp]:\/\/([^"]+)("[^<>]*>)/',
164  array(&$this, '_handleOmpUrl'),
165  $contents
166  );
167 
168  $templateMgr = TemplateManager::getManager($request);
169  $contents = $templateMgr->loadHtmlGalleyStyles($contents, $embeddableFiles);
170 
171  // Perform variable replacement for press, publication format, site info
172  $press = $request->getPress();
173  $site = $request->getSite();
174 
175  $paramArray = array(
176  'pressTitle' => $press->getLocalizedName(),
177  'siteTitle' => $site->getLocalizedTitle(),
178  'currentUrl' => $request->getRequestUrl()
179  );
180 
181  foreach ($paramArray as $key => $value) {
182  $contents = str_replace('{$' . $key . '}', $value, $contents);
183  }
184 
185  return $contents;
186  }
187 
188  function _handleOmpUrl($matchArray) {
189  $request = Application::get()->getRequest();
190  $url = $matchArray[2];
191  $anchor = null;
192  if (($i = strpos($url, '#')) !== false) {
193  $anchor = substr($url, $i+1);
194  $url = substr($url, 0, $i);
195  }
196  $urlParts = explode('/', $url);
197  if (isset($urlParts[0])) switch(strtolower_codesafe($urlParts[0])) {
198  case 'press':
199  $url = $request->url(
200  isset($urlParts[1]) ? $urlParts[1] : $request->getRequestedPressPath(),
201  null, null, null, null, $anchor
202  );
203  break;
204  case 'monograph':
205  if (isset($urlParts[1])) {
206  $url = $request->url(
207  null, 'catalog', 'book',
208  $urlParts[1], null, $anchor
209  );
210  }
211  break;
212  case 'sitepublic':
213  array_shift($urlParts);
214  import ('classes.file.PublicFileManager');
215  $publicFileManager = new PublicFileManager();
216  $url = $request->getBaseUrl() . '/' . $publicFileManager->getSiteFilesPath() . '/' . implode('/', $urlParts) . ($anchor?'#' . $anchor:'');
217  break;
218  case 'public':
219  array_shift($urlParts);
220  $press = $request->getPress();
221  import ('classes.file.PublicFileManager');
222  $publicFileManager = new PublicFileManager();
223  $url = $request->getBaseUrl() . '/' . $publicFileManager->getContextFilesPath($press->getId()) . '/' . implode('/', $urlParts) . ($anchor?'#' . $anchor:'');
224  break;
225  }
226  return $matchArray[1] . $url . $matchArray[3];
227  }
228 }
HtmlMonographFilePlugin\getDescription
getDescription()
Definition: HtmlMonographFilePlugin.inc.php:52
HtmlMonographFilePlugin\viewCallback
viewCallback($hookName, $params)
Definition: HtmlMonographFilePlugin.inc.php:62
HtmlMonographFilePlugin\getContextSpecificPluginSettingsFile
getContextSpecificPluginSettingsFile()
Definition: HtmlMonographFilePlugin.inc.php:37
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
HtmlMonographFilePlugin\_handleOmpUrl
_handleOmpUrl($matchArray)
Definition: HtmlMonographFilePlugin.inc.php:188
HtmlMonographFilePlugin\getDisplayName
getDisplayName()
Definition: HtmlMonographFilePlugin.inc.php:45
HtmlMonographFilePlugin\downloadCallback
downloadCallback($hookName, $params)
Definition: HtmlMonographFilePlugin.inc.php:97
PublicFileManager
Wrapper class for uploading files to a site/press' public directory.
Definition: PublicFileManager.inc.php:19
HtmlMonographFilePlugin\_getHTMLContents
_getHTMLContents($request, $monograph, $publicationFormat, $submissionFile)
Definition: HtmlMonographFilePlugin.inc.php:124
Plugin\getEnabled
getEnabled()
Definition: Plugin.inc.php:868
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
strtolower_codesafe
strtolower_codesafe($str)
Definition: functions.inc.php:280
Plugin\getPluginPath
getPluginPath()
Definition: Plugin.inc.php:330
Plugin\$request
$request
Definition: Plugin.inc.php:68
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
HtmlMonographFilePlugin
Class for HtmlMonographFile plugin.
Definition: HtmlMonographFilePlugin.inc.php:18
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
GenericPlugin
Abstract class for generic plugins.
Definition: GenericPlugin.inc.php:18