Example #1
0
 public function renderlatexTask()
 {
     $expression = Request::getVar('expression', '');
     $dir = PATH_APP . DS . 'cache' . DS . 'ckeditor' . DS . 'hubzeroequation' . DS;
     $filename = uniqid("equation_");
     $error = null;
     //build tex document
     $doc = '\\documentclass[12pt]{article}' . "\n";
     $doc .= '\\usepackage[utf8]{inputenc}' . "\n";
     $doc .= '\\usepackage{amssymb,amsmath}' . "\n";
     $doc .= '\\usepackage{color}' . "\n";
     $doc .= '\\usepackage{amsfonts}' . "\n";
     $doc .= '\\usepackage{amssymb}' . "\n";
     $doc .= '\\usepackage{pst-plot}' . "\n";
     $doc .= '\\begin{document}' . "\n";
     $doc .= '\\pagestyle{empty}' . "\n";
     $doc .= '\\begin{displaymath}' . "\n";
     $doc .= $expression . "\n";
     $doc .= '\\end{displaymath}' . "\n";
     $doc .= '\\end{document}' . "\n";
     //if cache doesn't exist, create it
     if (!is_dir($dir)) {
         \Hubzero\Filesystem::makeDirectory($dir);
     }
     if (file_put_contents($dir . DS . $filename . '.tex', $doc) === false) {
         throw new \Exception('Failed to open target file');
     }
     try {
         //execute latex to build dvi
         $command = 'cd ' . $dir . '; /usr/bin/latex ' . $filename . '.tex < /dev/null |grep ^!|grep -v Emergency > ' . $dir . DS . $filename . '.error 2> /dev/null 2>&1';
         exec($command, $output_lines, $exit_status);
         //execute dvi2png to build png
         $command = "/usr/bin/dvipng -bg 'transparent' -q -T tight -D 100 -o " . $dir . DS . $filename . '.png ' . $dir . DS . $filename . '.dvi 2>&1';
         exec($command, $output_lines, $exit_status);
         if ($exit_status != 0) {
             throw new \Exception("dvi2png failed");
         }
     } catch (\Exception $e) {
         $error = $e->getMessage();
     }
     //build response
     $object = new stdClass();
     if ($error) {
         $object->error = $error;
         $object->img = 'data:image/png;base64,';
     } else {
         //no errors - send base64 encoded image
         $object->error = "";
         $imgbinary = fread(fopen($dir . DS . $filename . '.png', 'r'), filesize($dir . DS . $filename . '.png'));
         $base64img = 'data:image/png;base64,' . base64_encode($imgbinary);
         $object->img = $base64img;
     }
     $object->expression = $expression;
     //clean up our cache mess
     shell_exec('rm ' . $dir . $filename . '.*');
     $this->send($object);
 }