Ejemplo n.º 1
0
function smarty_block_task($params, $content, Smarty_Internal_Template &$template)
{
    $ctxtParams = SmartyBlockContext::getInstance()->registerBlock($content, __FUNCTION__);
    if (!$content) {
        return;
        //---
    }
    /* @var $taskTpl Smarty_Internal_Template */
    $taskTpl = PSSmarty::template('common/task.tpl', $ctxtParams);
    $from = value_Array(array('from', 'c_from'), $params);
    $taskTpl->assign('from', $from);
    $taskTpl->assign('body', $content);
    $isSubTask = SmartyBlockContext::getInstance()->hasParentBlock('tasks');
    $taskTpl->assign('sub_task', $isSubTask);
    $taskNum = null;
    if (!$isSubTask) {
        $taskNumber = null;
        //Допускается вывод задач не в контексте
        $ctxt = FoldedContextWatcher::getInstance()->getTasksNumeratorContext(false);
        if ($ctxt) {
            $taskNumber = $ctxt->getNextTaskNumber();
        }
        $taskNum = $taskNumber ? "Задача № {$taskNumber}" : null;
    }
    $taskTpl->assign('task_num', $taskNum);
    $taskTpl->display();
}
Ejemplo n.º 2
0
function smarty_function_versein($params, Smarty_Internal_Template &$template)
{
    $params = ArrayAdapter::inst($params);
    $poetIdent = $params->str('poet');
    $verseIdent = $params->str('verse');
    $verse = PoetsManager::inst()->getVerse($poetIdent, $verseIdent);
    echo $verse->getContent();
    FoldedContextWatcher::getInstance()->setDependsOnEntity($verse->getFoldedEntity());
}
Ejemplo n.º 3
0
 /**
  * Метод строит плагин для отображения в popup окне
  */
 public function buildAsPopup($ident, ArrayAdapter $params)
 {
     $plugin = $this->getPlugin($ident);
     PluginFetchingContext::getInstance()->setContext($plugin->getIdent());
     $return = $this->buildImpl($plugin, null, $params);
     PluginFetchingContext::getInstance()->dropContext();
     FoldedContextWatcher::getInstance()->setDependsOnEntity($this->getFoldedEntity($ident));
     return $return;
 }
Ejemplo n.º 4
0
 /**
  * Метод выполняет фактическую замену TEX тега на его представление в виде картинки или спрайта.
  * 
  * @param str $original \[v_{\text{cp}}=\frac{\Delta S}{\Delta t}\]
  * @param str $formula    v_{\text{cp}}=\frac{\Delta S}{\Delta t}
  * @param str $type     block or inline
  */
 public function _replaceInTextImpl($original, $formula, $isBlock)
 {
     $type = $isBlock ? 'block' : 'inline';
     $replace = '';
     if ($formula) {
         /*
          * Проверяем, разрешена ли замена формул на спрайты и есть ли сейчас контекст.
          * Если всё выполнено, то это вовсе не означает, что необходимый спрайт подключен и есть 
          * спрайт для данной формулы.
          */
         if (PsDefines::isReplaceFormulesWithSprites() && FoldedContextWatcher::getInstance()->getSpritableContext()) {
             $replace = CssSpritesManager::getFormulaSprite(FoldedContextWatcher::getInstance()->getSpritableContext()->getSpritable(), $formula, array('TeX', $type));
         }
         /*
          * Если спрайта не нашлось, то заменяем на картинку.
          */
         if (!$replace) {
             $imgDi = $this->getImgDi($formula);
             $imgPath = $imgDi ? $imgDi->getRelPath() : null;
             if ($imgPath) {
                 $replace = PsHtml::img(array('src' => $imgPath, 'class' => "TeX {$type}", 'alt' => ''));
             } else {
                 $replace = $original;
             }
         }
     }
     /*
      * Логирование
      */
     if ($this->LOGGER->isEnabled()) {
         $this->LOGGER->info(++$this->replaced . ". Replacing {$type} TeX");
         $this->LOGGER->info("FULL:   {$original}");
         $this->LOGGER->info("CONTENT:  {$formula}");
         $this->LOGGER->info("SAVED:    {$formula}");
         $this->LOGGER->info("REPLACED: {$replace}");
         $this->LOGGER->info("\n");
     }
     return $replace;
 }
Ejemplo n.º 5
0
function smarty_block_f($params, $content, Smarty_Internal_Template &$template)
{
    if (isEmpty($content)) {
        return;
        //---
    }
    /*
     * Если это не TeX формула \[\], то это текстовая формула и её надо обработать.
     */
    if (!TexTools::isBlockFormula($content)) {
        $content = TextFormulesProcessor::processBlockFormula($content);
    }
    /*
     * Проверим, задан ли идентификатор для формулы.
     * Если задан - пронумеруем её, т.к. на неё будут ссылаться.
     */
    $formulaId = trim(value_Array(array('id', 'num'), $params));
    if (!$formulaId) {
        return $content;
    }
    return FoldedContextWatcher::getInstance()->getFormulaNumeratorContext()->wrapFormulaBox($formulaId, $content);
}
Ejemplo n.º 6
0
 private function getImages(ArrayAdapter $params, $FNAME)
 {
     $dir = $params->str('dir');
     $name = $params->get('name');
     //НЕПОСРЕДСТВЕННО КАРТИНКА
     if ($name instanceof DirItem) {
         return $name;
     }
     /*
      * FOLDING
      */
     $FCW = FoldedContextWatcher::getInstance();
     $folding = null;
     $ident = $params->get('ident');
     //Тип фолдинга. Он может быть передан либо в параметре 'group', либо по префиксу смарти-функции, например: postimg (post-название типа фолдинга).
     $foldingType = $params->get('group');
     $foldingType = $foldingType ? $foldingType : (starts_with($FNAME, 'img') ? null : array_get_value(0, explode('img', $FNAME)));
     //Подтип фолдинга, например: is - подтип фолдингов для фолдингов с типом post (выпуск журнала среди всех постов).
     $foldingSubType = $params->get('type');
     if ($params->has('post')) {
         /* @var $post AbstractPost */
         $post = $params->get('post');
         $ident = $post->getIdent();
         $folding = Handlers::getInstance()->getPostsProcessorByPostType($post->getPostType())->getFolding();
     } else {
         if ($foldingType) {
             $hasSubtype = FoldedStorage::isFoldingHasSubtype($foldingType);
             if ($hasSubtype && !$foldingSubType) {
                 //У фолдинга есть подтип, но в параметрах он не передан - определим фолдинг по контексту
                 $folding = $FCW->getFoldedEntityEnsureType($foldingType)->getFolding();
             } else {
                 $folding = FoldedStorageInsts::byTypeStype($foldingType, $foldingSubType);
             }
         } else {
             if ($foldingSubType) {
                 //Если передан только тип, то считаем, что имеется ввиду фолдинг поста
                 $folding = Handlers::getInstance()->getPostsProcessorByPostType($foldingSubType)->getFolding();
             }
         }
     }
     if ($folding && !$ident) {
         //У нас есть фолдинг, но нет идентификатора сущности - определим её из контекста
         $ident = $FCW->getFoldedEntityEnsureType($folding->getFoldingType())->getIdent();
     }
     if (!$dir && !$name && $ident && $folding) {
         /*
          * Не передано название картинки, но передан идентификатор сущности - показываем cover.
          * TODO - подумать, возможно имеет смысл сделать возможность показывать любую картинку в заданном размере.
          */
         return $folding->getCover($ident, $params->str('dim'));
     }
     /*
      * Берём путь "как есть", если: 
      * 1. Передан специальный параметр asis
      * 2. Передана dir, и она начинается с '/'
      * 3. Не передана dir, но при этом name начинается с '/'
      * 4. dir или name указывают на адрес в интернете
      */
     $asis = $params->bool('asis') || starts_with($dir, DIR_SEPARATOR) || !$dir && starts_with($name, DIR_SEPARATOR) || PsUrl::isHttp($dir) || PsUrl::isHttp($name);
     if ($asis) {
         if (!$dir) {
             return $name;
         }
         if (starts_with($name, DIR_SEPARATOR)) {
             return cut_string_end($dir, DIR_SEPARATOR) . $name;
         }
         return ($name ? ensure_ends_with($dir, DIR_SEPARATOR) : $dir) . $name;
     }
     /** @var DirManager */
     $DM = null;
     /*
      * Теперь определим DirManager. Мы его можем взять:
      */
     if ($folding) {
         //1. Из ресурсов фолдинга
         $DM = $folding->getResourcesDm($ident, 'src');
     } else {
         //2. Обычный resources->images, если фолдинг не установлен
         $DM = DirManager::images();
     }
     /*
      * Определим список показываемых картинок по атрибуту $name. Пример тега:
      * {postimg type='tr' ident='matrix' name='mao.gif mu.png mu.png'}
      * Просто разделим значение атрибута $name по точкам и пробелам и склеим в названия картинок.
      */
     $NAMES = preg_split("/[. ]/", $name);
     $DI = $DM ? $DM->getDirItem($dir, $name) : DirItem::inst($dir, $name);
     if (count($NAMES) % 2 != 0 || $DI->isImg()) {
         //Указано что-то непонятное - не чётное кол-во составных элементов
         return $DI;
     }
     $IMAGES = array();
     for ($i = 0; $i < count($NAMES); $i += 2) {
         $imgName = $NAMES[$i] . '.' . $NAMES[$i + 1];
         $IMAGES[] = $DM ? $DM->getDirItem($dir, $imgName) : DirItem::inst($dir, $imgName);
     }
     return $IMAGES;
 }
Ejemplo n.º 7
0
function smarty_modifier_fhref($formulaId)
{
    return FoldedContextWatcher::getInstance()->getFormulaNumeratorContext()->getFormulaHref($formulaId);
}
Ejemplo n.º 8
0
function smarty_modifier_ihref($imageId)
{
    return FoldedContextWatcher::getInstance()->getImageNumeratorContext()->getBlockImgHref($imageId);
}
Ejemplo n.º 9
0
 public function fetchTplImpl($ident, $smParams = null, $returnType = self::FETCH_RETURN_CONTENT, $addResources = false, $cacheId = null)
 {
     $this->assertHasAccess($ident);
     $logMsg = null;
     if ($this->LOGGER->isEnabled()) {
         $rqNum = ++self::$FETCH_REQUEST_CNT;
         $logMsg = "#{$rqNum} Smarty params count: " . count(to_array($smParams)) . ", type: {$returnType}, resources: " . var_export($addResources, true) . ", " . ($cacheId ? "cache id: [{$cacheId}]" : 'nocache');
         $this->LOGGER->info("Tpl fetching requested for entity [{$ident}]. {$logMsg}");
         FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_ENTITY_FETCH_REQUESTD, $this, $ident, $logMsg);
     }
     $entity = $this->getFoldedEntity($ident);
     //Сразу установим зависимость от текущей сущности
     FoldedContextWatcher::getInstance()->setDependsOnEntity($entity);
     $CTXT = $this->getFoldedContext();
     $PCLASS = $CTXT->tplFetchParamsClass();
     $PCLASS_BASE = FoldedTplFetchPrams::getClassName();
     check_condition(PsUtil::isInstanceOf($PCLASS, $PCLASS_BASE), "Класс [{$PCLASS}] для хранения данных контекста {$CTXT} должен быть подклассом {$PCLASS_BASE}");
     //Если мы не возвращаем содержимое, то в любом случае ресурсы добавлять не к чему
     $addResources = $addResources && !in_array($returnType, array(self::FETCH_RETURN_PARAMS, self::FETCH_RETURN_PARAMS_OB));
     $keysRequired = PsUtil::getClassConsts($PCLASS, 'PARAM_');
     $keysRequiredParams = array_diff($keysRequired, array(FoldedTplFetchPrams::PARAM_CONTENT));
     $PARAMS = null;
     $PARAMS_KEY = null;
     $CONTENT = null;
     $CONTENT_KEY = null;
     $RETURN_KEY = null;
     if ($cacheId) {
         $cacheId = ensure_wrapped_with($cacheId, '[', ']') . '[' . PsDefines::getReplaceFormulesType() . ']';
         $RETURN_KEY = $cacheId . '-' . $returnType;
         if (array_key_exists($ident, $this->FETCH_RETURNS)) {
             if (array_key_exists($RETURN_KEY, $this->FETCH_RETURNS[$ident])) {
                 return $this->FETCH_RETURNS[$ident][$RETURN_KEY];
             }
         } else {
             $this->FETCH_RETURNS[$ident] = array();
         }
         $PARAMS_KEY = empty($keysRequiredParams) ? null : $cacheId . '-params';
         $CONTENT_KEY = $cacheId . '-content';
         switch ($returnType) {
             case self::FETCH_RETURN_FULL:
             case self::FETCH_RETURN_FULL_OB:
                 $CONTENT = $this->getFromFoldedCache($ident, $CONTENT_KEY);
                 $PARAMS = $PARAMS_KEY ? $this->getFromFoldedCache($ident, $PARAMS_KEY, $keysRequiredParams) : array();
                 if ($CONTENT && is_array($PARAMS)) {
                     $CONTENT = $addResources ? $this->getResourcesLinks($ident, $CONTENT) : $CONTENT;
                     $PARAMS[FoldedTplFetchPrams::PARAM_CONTENT] = $CONTENT;
                     switch ($returnType) {
                         case self::FETCH_RETURN_FULL:
                             return $this->FETCH_RETURNS[$ident][$RETURN_KEY] = $PARAMS;
                         case self::FETCH_RETURN_FULL_OB:
                             return $this->FETCH_RETURNS[$ident][$RETURN_KEY] = new $PCLASS($PARAMS);
                         default:
                             raise_error("Unprocessed fetch return type [{$returnType}].");
                     }
                 }
                 break;
             case self::FETCH_RETURN_CONTENT:
                 $CONTENT = $this->getFromFoldedCache($ident, $CONTENT_KEY);
                 if ($CONTENT) {
                     $CONTENT = $addResources ? $this->getResourcesLinks($ident, $CONTENT) : $CONTENT;
                     return $this->FETCH_RETURNS[$ident][$RETURN_KEY] = $CONTENT;
                 }
                 break;
             case self::FETCH_RETURN_PARAMS:
             case self::FETCH_RETURN_PARAMS_OB:
                 $PARAMS = $PARAMS_KEY ? $this->getFromFoldedCache($ident, $PARAMS_KEY, $keysRequiredParams) : array();
                 if (is_array($PARAMS)) {
                     switch ($returnType) {
                         case self::FETCH_RETURN_PARAMS:
                             return $this->FETCH_RETURNS[$ident][$RETURN_KEY] = $PARAMS;
                         case self::FETCH_RETURN_PARAMS_OB:
                             return $this->FETCH_RETURNS[$ident][$RETURN_KEY] = new $PCLASS($PARAMS);
                         default:
                             raise_error("Unprocessed fetch return type [{$returnType}].");
                     }
                 }
                 break;
         }
     }
     $settedNow = false;
     if (!$entity->equalTo(FoldedContextWatcher::getInstance()->getFoldedEntity())) {
         $CTXT->setContextWithFoldedEntity($entity);
         $settedNow = true;
     }
     try {
         $CONTENT = $this->getTpl($ident, $smParams)->fetch();
         $entityNow = FoldedContextWatcher::getInstance()->getFoldedEntity();
         check_condition($entity->equalTo($entityNow), "After tpl fetching folded entity [{$entity}] chenged to [{$entityNow}]");
         $PARAMS_FULL = $CTXT->finalizeTplContent($CONTENT);
         check_condition(is_array($PARAMS_FULL), "After [{$entity}] tpl finalisation not array is returned");
         $keysReturned = array_keys($PARAMS_FULL);
         if (count(array_diff($keysReturned, $keysRequired)) || count(array_diff($keysRequired, $keysReturned))) {
             raise_error("After [{$entity}] tpl finalisation required keys: " . array_to_string($keysRequired) . '], returned keys: [' . array_to_string($keysReturned) . ']');
         }
         if ($this->LOGGER->isEnabled()) {
             $this->LOGGER->info("Tpl fetching actually done for entity [{$ident}]. {$logMsg}");
             FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_ENTITY_FETCH_DONE, $this, $ident, $logMsg);
         }
     } catch (Exception $e) {
         /*
          * Произошла ошибка!
          * 
          * Если мы устанавливали контенст и он не поменялся после завершения фетчинга (если поменялся, это ошибка), то нужно его обязательно завершить.
          * Если контекст был установлен во внешнем блоке, то этот блок должен позаботиться о сбросе контекста.
          * 
          * Далее от нас требуется только пробросить ошибку наверх.
          */
         if ($settedNow && $entity->equalTo(FoldedContextWatcher::getInstance()->getFoldedEntity())) {
             $CTXT->dropContext();
         }
         throw $e;
     }
     $CONTENT = $PARAMS_FULL[FoldedTplFetchPrams::PARAM_CONTENT];
     $PARAMS = $PARAMS_FULL;
     unset($PARAMS[FoldedTplFetchPrams::PARAM_CONTENT]);
     if ($PARAMS_KEY) {
         $this->saveToFoldedCache($PARAMS, $ident, $PARAMS_KEY);
     }
     if ($CONTENT_KEY) {
         $this->saveToFoldedCache($CONTENT, $ident, $CONTENT_KEY);
     }
     if ($settedNow) {
         $CTXT->dropContext();
     }
     if ($addResources) {
         $CONTENT = $this->getResourcesLinks($ident, $CONTENT);
         $PARAMS_FULL[FoldedTplFetchPrams::PARAM_CONTENT] = $CONTENT;
     }
     switch ($returnType) {
         case self::FETCH_RETURN_FULL:
             return $RETURN_KEY ? $this->FETCH_RETURNS[$ident][$RETURN_KEY] = $PARAMS_FULL : $PARAMS_FULL;
         case self::FETCH_RETURN_FULL_OB:
             return $RETURN_KEY ? $this->FETCH_RETURNS[$ident][$RETURN_KEY] = new $PCLASS($PARAMS_FULL) : new $PCLASS($PARAMS_FULL);
         case self::FETCH_RETURN_CONTENT:
             return $RETURN_KEY ? $this->FETCH_RETURNS[$ident][$RETURN_KEY] = $CONTENT : $CONTENT;
         case self::FETCH_RETURN_PARAMS:
             return $RETURN_KEY ? $this->FETCH_RETURNS[$ident][$RETURN_KEY] = $PARAMS : $PARAMS;
         case self::FETCH_RETURN_PARAMS_OB:
             return $RETURN_KEY ? $this->FETCH_RETURNS[$ident][$RETURN_KEY] = new $PCLASS($PARAMS) : new $PCLASS($PARAMS);
     }
     raise_error("Unknown fetch return type [{$returnType}].");
 }
Ejemplo n.º 10
0
 /**
  * Наблюдатели за контекстом
  */
 private static function watchers()
 {
     return array(FoldedContextWatcher::getInstance());
 }