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);
}
示例#2
0
<?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);