function displayLocalisedErrorPage($message, $errorNumber, $errorData) { if (defined('DOCVERT_ERROR_OCCURED')) { define('DOCVERT_RECURSIVE_ERROR', true); } define('DOCVERT_ERROR_OCCURED', true); if (!headers_sent()) { header('HTTP/1.1 ' . $errorNumber); header('Status: ' . $errorNumber); } $pageType = 'unknown'; if (substr($errorNumber, 0, 1) == '2') { $title = '&error-ok;'; $pageType = 'good'; } else { $title = '&error-error;'; $pageType = 'bad'; } if (!defined('DOCVERT_CLIENT_TYPE')) { $errorMessage = '&error-programming-error-docvert-client-type;'; $errorMessage = preg_replace_callback('/\\&(.*?)\\;/s', 'replaceLanguagePlaceholder', $errorMessage); die($errorMessage); } switch (DOCVERT_CLIENT_TYPE) { case 'web': $head = '<style type="text/css">body{font-family:sans-serif;} h1{font-size:large;} h2{font-size:medium} h3{font-size:small} .windowTitle{color:white;margin:0px;padding:5px;font-size:small} .bad {background:#ffeeee; border:solid 2px red} .bad .windowTitle {background:red} .good {background:#eeffee;border: solid 2px #bbccbb} .good .windowTitle {background:#006600} .footer {margin-top:0px;padding:4px;font-size:small} .bad .footer {background:#ffcccc} .bad .footer .divider {color:#ffcccc} .good .footer {background:#ccffcc} .good .footer .divider {color:#ccffccc} .standardAdvice {margin:30px 0px 0px 0px; padding: 0px 0px 10px 15px;} </style>'; $body = '<div class="' . $pageType . '">' . "\n"; $body .= ' <h1 class="windowTitle">Docvert: ' . $title . ' ' . $errorNumber . '</h1>' . "\n"; $body .= ' <div style="padding:10px">' . "\n"; $body .= ' ' . $message . "\n"; $body .= ' </div>' . "\n"; $body .= ' &error-footer;' . "\n"; $body .= '</div>' . "\n"; $template = getXHTMLTemplate(); $template = str_replace('{{title}}', $title, $template); $template = str_replace('{{head}}', $head, $template); $template = str_replace('{{body}}', $body, $template); $template = preg_replace_callback('/\\&(.*?)\\;/s', 'replaceLanguagePlaceholder', $template); if ($errorData) { foreach ($errorData as $key => $value) { $template = str_replace('&dynamic-' . $key . ';', revealXml($value), $template); } } die($template); break; case 'command line': $message = preg_replace_callback('/\\&(.*?)\\;/s', 'replaceLanguagePlaceholder', $message); if ($errorData) { foreach ($errorData as $key => $value) { $message = str_replace('&dynamic-' . $key . ';', revealXml($value), $message); } } $endOfBlockElements = array('</p>', '</h1>', '</h2>', '</h3>', '</h4>', '</h5>', '</h6>', '</li>', '</blockquote>'); $message = str_replace($endOfBlockElements, "\n", $message); $message = preg_replace('/<.*?>/s', '', $message); $message = str_replace('<', '<', $message); $message = str_replace('>', '>', $message); $message = str_replace('&', '&', $message); $message .= "\n"; $message = trim($message) . "\n"; if ($pageType == 'bad') { file_put_contents("php://stderr", $message); } else { print $message; } die; break; } }
function applyPipeline($contentPath, $pipelineToUse, $autoPipeline, $previewDirectory, $skipAheadToDocbook = false) { if (!trim($contentPath)) { webServiceError('&error-no-content-xml-found;'); } if (!file_exists($contentPath)) { webServiceError('Unable to find ' . revealXml(basename($contentPath)) . ' file in "' . revealXml(dirname($contentPath)) . '"'); } $contentDirectory = dirname($contentPath); $pipelineDirectory = DOCVERT_DIR . 'pipeline' . DIRECTORY_SEPARATOR . $pipelineToUse . DIRECTORY_SEPARATOR; $pipelinePath = $pipelineDirectory . 'pipeline.xml'; if (!file_exists($pipelinePath)) { webServiceError('&error-no-pipeline-found;', 500, array('pipelinePath' => $pipelinePath)); } $pipelineString = file_get_contents($pipelinePath); $pipelineString = removeXmlDeclaration($pipelineString); $pipelineString = trim($pipelineString); if (strpos($pipelineString, '<autopipeline') !== false) { $autoPipelineString = substr($pipelineString, strpos($pipelineString, '<autopipeline>') + 14); $autoPipelineString = substr($autoPipelineString, 0, strpos($autoPipelineString, '</autopipeline>')); $autoPipelinesDirectory = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'auto-pipelines' . DIRECTORY_SEPARATOR; $chosenAutoPipeline = $autoPipeline; if (!trim($chosenAutoPipeline)) { $defaultAutoPipelines = glob($autoPipelinesDirectory . '*.default.xml'); if (count($defaultAutoPipelines) == 1) { $chosenAutoPipeline = substringBefore($defaultAutoPipelines[0], '.xml'); } $chosenAutoPipeline = str_replace($autoPipelinesDirectory, '', $chosenAutoPipeline); } $chosenAutoPipeline = str_replace('.default', '', $chosenAutoPipeline); if (strpos($chosenAutoPipeline, '.') === true || strpos($chosenAutoPipeline, '/') === true || strpos($chosenAutoPipeline, '\\') === true) { webServiceError('&error-pipeline-error;', 400, array('chosenAutoPipeline' => $chosenAutoPipeline)); } $autoPipelinePath = $autoPipelinesDirectory . $chosenAutoPipeline . '.xml'; if (!trim($chosenAutoPipeline)) { webServiceError('error-autopipeline-empty;', 400); } elseif (!file_exists($autoPipelinePath)) { $autoPipelinePath = $autoPipelinesDirectory . $chosenAutoPipeline . '.default.xml'; if (!file_exists($autoPipelinePath)) { webServiceError('&error-autopipeline-not-found; ' . revealXml($chosenAutoPipeline), 400); } } $pipelineString = file_get_contents($autoPipelinePath); if (stripos($pipelineString, '{{custom-stages}}') === false) { webServiceError('&error-autopipeline-missing-placeholder; ' . revealXml($autoPipelinePath)); } $pipelineString = str_replace('{{custom-stages}}', $autoPipelineString, $pipelineString); } $pipelineString = substr($pipelineString, strpos($pipelineString, '<pipeline>') + 10); $pipelineString = substr($pipelineString, 0, strpos($pipelineString, '</pipeline>')); if ($skipAheadToDocbook) { $toDocbookPartOfPipelinePattern = "/.*?ToDocBook[^>]*?>/s"; $pipelineString = preg_replace($toDocbookPartOfPipelinePattern, '', $pipelineString); } $pipelineStages = xmlStringToArray($pipelineString); $currentXml = file_get_contents($contentPath); $currentXml = fixImagePaths($currentXml); $pipelineSettings = array("pipeline" => $pipelineToUse, "autopipeline" => $autoPipeline); processAPipelineLevel($pipelineStages, $currentXml, $pipelineDirectory, $contentDirectory, $previewDirectory, $pipelineSettings); $testResultsPath = $contentDirectory . DIRECTORY_SEPARATOR . 'test.html'; if (file_exists($testResultsPath)) { $title = 'Document Unit Tests'; $body = file_get_contents($testResultsPath) . "\n"; $template = getXHTMLTemplate(); $template = str_replace('{{title}}', $title, $template); $template = str_replace('{{body}}', '<h1>Document Notices</h1>' . "\n" . '<p class="timestamp"><span class="time">' . date('r') . '</span></p>' . $body, $template); $template = str_replace('{{head}}', '<style type="text/css"> body {font-size:small} .note{background:#eeeeff;border:solid 1px #9999ff; padding:10px;margin-bottom:10px} .error{background:#ffeeee;border: solid 1px red; padding:10px;margin-bottom:10px} h1{font-size:medium;} p {margin-top:0px;} .error h1{margin:0px;padding:0px;} .timestamp {font-size:x-small;color:#999999} .validation{background:#eeeeff; border: solid 1px blue; padding:10px;margin-bottom:10px} p {margin:0px;} .warning {background:#eeeeff; border: solid 1px blue; padding:10px;margin-bottom:10px} </style>', $template); file_put_contents($testResultsPath, $template); } $stylesXmlPath = $contentDirectory . DIRECTORY_SEPARATOR . 'styles.xml'; if (file_exists($stylesXmlPath)) { silentlyUnlink($stylesXmlPath); } }