/** * Метод вызывается и производит замены в TeX формул посредством вызова $callback. * * @param string $string - строка, в которой будет производиться поиск * @param callable $callback - функция обратного вызова * function($original, $content, $isBlock). Пример: function(\[x\], x, true). * @param bool $replcaAllToImaged - признак, нужно ли предварительно заменить все формулы * на их представление, заменяемое на картинки * @return string - строка с произведёнными заменами */ public static function replaceTeX($string, $callback, $replcaAllToImaged) { if (isEmpty($string)) { return ''; } if (!self::assertTexValid($string)) { return $string; } if ($replcaAllToImaged) { $string = self::replaceMacrosToImaged($string); } $b_callback = function ($matches) use(&$callback) { $formula = TexTools::safeFormula($matches[1]); return call_user_func($callback, "\\[{$formula}\\]", $formula, true); }; $string = preg_replace_callback('/\\\\\\[(.+?)\\\\\\]/si', $b_callback, $string); $i_callback = function ($matches) use(&$callback) { $formula = TexTools::safeFormula($matches[1]); return call_user_func($callback, "\\({$formula}\\)", $formula, false); }; $string = preg_replace_callback('/\\\\\\((.+?)\\\\\\)/si', $i_callback, $string); return $string; }
/** * Метод возвращает DirItem элемента, содержащего картинку-представление формулы. * * @param type $formula - текстовая формула * @param type $createIfNotExists - признак, стоит ли пытаться создавать картинку для формулы * @return DirItem */ public function getImgDi($formula, $createIfNotExists = true) { $formula = TexTools::safeFormula($formula); if ($this->CACHE->has($formula)) { return $this->CACHE->get($formula); } $hash = TexTools::formulaHash($formula); $imgDI = $this->DM->getHashedDirItem(null, $hash, $hash, 'gif'); if ($imgDI->isImg()) { $this->CACHE->set($formula, $imgDI); return $imgDI; } if (!$createIfNotExists) { return null; } //Создаём структуру директорий $imgDI->makePath(); $contents = ''; //Запрашиваем графическое представление $this->PROFILER->start($formula); try { //TODO - делать это локально, чтобы не зависить от стороннего сервиса $handle = fopen('http://latex.codecogs.com/gif.latex?' . rawurlencode($formula), 'r'); while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); $this->PROFILER->stop(); } catch (Exception $ex) { //Останавливаем профайлер без сохранения $this->PROFILER->stop(false); //Делаем дамп ошибки ExceptionHandler::dumpError($ex, "Tex formula convertation requested for:\n{$formula}"); //Попытаемся подчистить за собой, если мы что-то создали $imgDI->remove(); //Пробрасываем эксепшн throw $ex; } //Сохраняем картинку в файл $imgDI->putToFile($contents); //Сохраним текстовое представление $this->DM->getHashedDirItem(null, $hash, $hash, 'gif.tex')->putToFile($formula); $this->CACHE->set($formula, $imgDI); return $imgDI; }