function generateContest($tasks, $contestID, $contestFolder, $fullFeedback = false, $status = 'RunningContest') { global $mode, $contestLocalDir; if ($status == 'RunningContest' || $status == 'FutureContest') { $generateSolutions = false; } $strQuestions = ''; $strQuestionsArr = array(); $strSolutions = ''; $images = array(); $imagesSols = array(); $jsModulesRes = array(); $cssModulesRes = array(); $strGraders = ""; $tasks = json_decode($_REQUEST['tasks'], true); $numPart = 0; $nameParts = ""; $buffer = ""; foreach ($tasks as $curTask) { $strQuestion = ""; $jsQuestions = ''; $cssQuestions = ''; $cssSolutions = ''; $jsModules = array(); $jsCurrentModules = array(); $cssCurrentModules = array(); $cssModules = array(); list($curFolder, $curKey) = explode('/', $curTask['url']); $taskUrl = $curTask['url'] . '/'; $task = new PEMTaskCompiler($curTask['bebras'], __DIR__ . '/beaver_tasks/' . $curFolder . '/' . $curKey . '/', true); // Task directory if ($mode != "aws") { $dstDir = $contestLocalDir . $contestFolder . '/' . $curKey; if (!is_dir($dstDir)) { mkdir($dstDir); } } // Copy bebras.js $bebrasJsContent = 'var json = ' . $task->getBebrasJson() . '; function getTaskResources() { return json; }'; $bebrasJsDstFile = $contestFolder . '/' . $curKey . '/bebras.js'; contestPutContents($bebrasJsDstFile, $bebrasJsContent); $curImages = $task->copyImages(PEMTaskCompiler::TASK, $contestFolder . '/' . $curKey, 'contestCopyFile'); $images = array_merge($images, Bebras::addAbsoluteStaticPath($curImages, $contestFolder . '/' . $curKey)); $curImagesSols = $task->copyImages(PEMTaskCompiler::SOLUTION, $contestFolder . '/' . $curKey, 'contestCopyFileSols'); $imagesSols = array_merge($imagesSols, Bebras::addAbsoluteStaticPath($curImagesSols, $contestFolder . '/' . $curKey)); // Convert JS and CSS image path $questionJs = $task->getJavascript(PEMTaskCompiler::TASK | PEMTaskCompiler::SAT | PEMTaskCompiler::DISPLAY | PEMTaskCompiler::PROXY); $solutionJs = $task->getJavascript(PEMTaskCompiler::SOLUTION); $questionCss = $task->getCss(PEMTaskCompiler::TASK | PEMTaskCompiler::SAT | PEMTaskCompiler::DISPLAY | PEMTaskCompiler::PROXY); $solutionCss = $task->getCss(PEMTaskCompiler::SOLUTION); // Javascript & css modules $modules = $task->getModules(); $jsCurrentModules = $modules['jsModules']['ref']; $jsModulesRes = array_merge($jsModulesRes, $jsCurrentModules); $cssCurrentModules = $modules['cssModules']['ref']; $cssModulesRes = array_merge($cssModulesRes, $cssCurrentModules); // JS modules content foreach ($modules['jsModules']['inline'] as $curJsModuleContent) { $jsQuestions .= $curJsModuleContent; } // Css modules content foreach ($modules['cssModules']['inline'] as $curCssModuleContent) { $cssQuestions .= $curCssModuleContent; } // Javascript grader $strGraders .= '<div id="javascript-grader-' . $curKey . '" data-content="' . htmlspecialchars($task->getGrader(), ENT_COMPAT, 'UTF-8') . '"></div>' . "\r\n"; $questionRelatedJs = Bebras::moveQuestionImagesSrc($questionJs, $curKey, $contestFolder); $solutionRelatedJs = Bebras::moveQuestionImagesSrc($solutionJs, $curKey, $contestFolder); $cssQuestions .= Bebras::moveQuestionImagesSrc($questionCss, $curKey, $contestFolder); $cssSolutions .= Bebras::moveQuestionImagesSrc($solutionCss, $curKey, $contestFolder); // Content $questionBody = $task->getContent(PEMTaskCompiler::TASK); $questionSolution = $task->getContent(PEMTaskCompiler::SOLUTION); // Remove absolute images $questionBody = preg_replace('#http\\://.*\\.(png|jpg|gif|jpeg)#isU', '', $questionBody); $strQuestion .= '<div id="question-' . $curKey . '" class="question"><div id="task" class="taskView">' . "\r\n" . '<style>' . $cssQuestions . '</style>' . Bebras::moveQuestionImagesSrc($questionBody, $curKey, $contestFolder) . '</div></div>' . "\r\n"; $strQuestion .= '<div id="javascript-' . $curKey . '" data-content="' . htmlspecialchars($questionRelatedJs, ENT_COMPAT, 'UTF-8') . '"></div>' . "\r\n"; foreach ($jsCurrentModules as $name => $content) { $strQuestion .= '<div class="js-module-' . $curKey . '" data-content="' . $name . '"></div>' . "\n"; } foreach ($cssCurrentModules as $name => $content) { $strQuestion .= '<div class="css-module-' . $curKey . '" data-content="' . $name . '"></div>' . "\n"; } $strSolutions .= '<div id="solution-' . $curKey . '" class="solution">' . "\r\n" . '<style>' . $cssSolutions . '</style>' . Bebras::moveQuestionImagesSrc($questionSolution, $curKey, $contestFolder) . '</div>' . "\r\n" . '<div id="javascript-solution-' . $curKey . '" data-content="' . htmlspecialchars($solutionRelatedJs, ENT_COMPAT, 'UTF-8') . '"></div>' . "\r\n"; $strQuestions .= $strQuestion; contestAddContent($contestFolder, $strQuestion, $nameParts, $buffer, $numPart, false); } $jsPreload = "\r\n//ImagesLoader is injected by the platform just before the contest is loaded\r\n"; $jsPreload .= "ImagesLoader.setImagesToPreload([\n'" . implode("' ,\n'", $images) . "']);\r\n"; $jsPreload .= "function preloadSolImages() { var imagesToLoad = [\n'" . implode("' ,\n'", $imagesSols) . "'];\r\n ImagesLoader.addImagesToPreload(imagesToLoad);\r\n}\n"; $htAccessContent = '<Files "contest_' . $contestID . '_sols.html">' . "\n" . "\t" . 'Deny from all' . "\n" . '</Files>' . "\n" . '<Files "bebras.js">' . "\n" . "\t" . 'Deny from all' . "\n" . '</Files>' . "\n"; if (!$fullFeedback) { $htAccessContent .= '<Files "contest_' . $contestID . '_graders.html">' . "\n" . "\t" . 'Deny from all' . "\n" . '</Files>' . "\n"; } // Compile js modules $strQuestions .= "\n"; foreach ($jsModulesRes as $name => $content) { $strModule = '<div class="js-module" id="js-module-' . $name . '" data-content="' . htmlspecialchars($content, ENT_COMPAT, 'UTF-8') . '"></div>' . "\n"; $strQuestions .= $strModule; contestAddContent($contestFolder, $strModule, $nameParts, $buffer, $numPart, false); } // Compile css modules $strQuestions .= "\n"; foreach ($cssModulesRes as $name => $content) { $strModule .= '<div class="css-module" id="css-module-' . $name . '" data-content="' . htmlspecialchars($content, ENT_COMPAT, 'UTF-8') . '"></div>' . "\n"; $strQuestions .= $strModule; contestAddContent($contestFolder, $strModule, $nameParts, $buffer, $numPart, false); } contestAddContent($contestFolder, "", $nameParts, $buffer, $numPart, true); contestPutContents($contestFolder . '/index.txt', trim($nameParts)); // Preload //$strQuestions .= '<div id="preload-images-js" data-content="'.htmlspecialchars($jsPreload, ENT_COMPAT, 'UTF-8').'"></div>'."\n"; // Create files contestPutContents($contestFolder . '/contest_' . $contestID . '.html', $strQuestions); contestPutContents($contestFolder . '/contest_' . $contestID . '_sols.html', $strSolutions, true); contestPutContents($contestFolder . '/contest_' . $contestID . '.js', $jsPreload); contestPutContents($contestFolder . '/contest_' . $contestID . '_graders.html', $strGraders, !$fullFeedback); contestPutContents($contestFolder . '/.htaccess', $htAccessContent, true); }
<?php /* Copyright (c) 2012 Association France-ioi, MIT License http://opensource.org/licenses/MIT */ // Disable for now, see later if this file is still usefull exit; require_once 'bebras/Bebras.php'; require_once 'lib/Route.php'; require_once 'lib/Task.php'; if (!isset($_GET['url'])) { throw new Exception('This file cannot be accessed directly.'); } $route = new Route(Bebras::getQuestionsDirectory(), $_GET['url']); if ($route::isImage($_GET['url'])) { $route->displayImage(); exit; } if ($route::isFile($_GET['url'])) { // TODO: Maybe manage this with pub/private keys if (!in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1'))) { echo 'Access denied'; exit; } $route->displayFile(); exit; } echo $route->getJsonPath() . ' ' . $route->getTaskPath() . ' ' . $route->getTaskDir(); die; $task = new Task($route->getJsonPath(), $route->getTaskPath(), $route->getTaskDir()); // Disable, see later if this file is still usefull exit; // Asking for the JSON
/** * Generate Bebras JSON for each tasks */ require_once "../../shared/common.php"; require_once 'Bebras.php'; function getAllQuestions($db) { $stmt = $db->prepare("SELECT `question`.`ID`, `question`.`key`, `question`.`folder`, `question`.`name`, `question`.`answerType`, `question`.`expectedAnswer` FROM `question`"); $stmt->execute(); $questionsData = array(); while ($row = $stmt->fetchObject()) { $questionsData[$row->ID] = $row; } return $questionsData; } $questionsDir = Bebras::getQuestionsDirectory(); $questions = getAllQuestions($db); foreach ($questions as $curQuestion) { $curQuestionDir = $questionsDir . '/' . $curQuestion->folder . '/' . $curQuestion->key; if (is_dir($curQuestionDir)) { $content = file_get_contents($curQuestionDir . '/index.html'); // Add id //$content = preg_replace('#(var json = {.*\"id\": \")(\",)#isU', '$1http://castor-informatique.fr/tasks/'.$curQuestion->folder . '/' . $curQuestion->key.'/$2', $content); // Windows to UNIX conversion //$content = str_replace(chr(13).chr(10), chr(10), $content); //file_put_contents($curQuestionDir.'/index.html', $content); // Add postmessage $content = str_replace('<script class="remove" type="text/javascript" src="../../modules/gen_task_resources.js"></script>', '<script class="remove" type="text/javascript" src="../../modules/gen_task_resources.js"></script>' . "\r\n" . '<script class="module beaver" type="text/javascript" src="../../modules/jquery.ba-postmessage.min.js" id="http://castor-informatique.fr/tasks/modules/jquery.ba-postmessage.min.js"></script>' . "\r\n" . '<script class="module beaver" type="text/javascript" src="../../modules/pm_task_interface.js" id="http://castor-informatique.fr/tasks/modules/pm_task_interface.js"></script>' . "\r\n", $content); file_put_contents($curQuestionDir . '/index.html', $content); echo $curQuestionDir . '<br />'; /*$bebras = new Bebras($curQuestion, $curQuestionDir);