Инструменты пользователя

Инструменты сайта


wiki:xref:dokuwiki:inc:template.php

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

wiki:xref:dokuwiki:inc:template.php [2024/08/26 00:54] – создано vladpolskiywiki:xref:dokuwiki:inc:template.php [2024/08/26 01:24] (текущий) vladpolskiy
Строка 3: Строка 3:
  
 3 /** 3 /**
-4  * DokuWiki template functions+4  * Функции шаблонов DokuWiki
 5  * 5  *
 6  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html) 6  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
Строка 22: Строка 22:
 21 use dokuwiki\File\PageResolver; 21 use dokuwiki\File\PageResolver;
 22  22 
-23 /** +23/** 
-24  Access a template file +24* Доступ к файлу шаблона 
-25  +25* 
-26  Returns the path to the given file inside the current templateuses +26* Возвращает путь к указанному файлу внутри текущего шаблонаиспользует 
-27  default template if the custom version doesn't exist+27* шаблон по умолчанию, если пользовательская версия не существует
-28  +28* 
-29  * @param string $file +29* @param  string $ файл 
-30  * @return string +30* @возвращаемая  строка 
-31  +31* 
-32  * @author Andreas Gohr <andi@splitbrain.org> +32* @автор Андреас Гор <andi@splitbrain.org> 
-33  */+33*/
 34 function template($file) 34 function template($file)
 35 { 35 {
Строка 43: Строка 43:
 42 } 42 }
 43  43 
-44 /** +44/** 
-45  Convenience function to access template dir from local FS +45* Удобная функция для доступа к каталогу шаблонов из локальной ФС 
-46  +46* 
-47  This replaces the deprecated DOKU_TPLINC constant +47* Заменяет устаревшую константу DOKU_TPLINC. 
-48  +48* 
-49  * @param string $tpl The template to usedefault to current one +49* @param  string $ tpl Шаблон для использованияпо умолчанию текущий 
-50  * @return string +50* @возвращаемая  строка 
-51  +51* 
-52  * @author Andreas Gohr <andi@splitbrain.org> +52* @автор Андреас Гор <andi@splitbrain.org> 
-53  */+53*/
 54 function tpl_incdir($tpl = '') 54 function tpl_incdir($tpl = '')
 55 { 55 {
Строка 60: Строка 60:
 59 } 59 }
 60  60 
-61 /** +61/** 
-62  Convenience function to access template dir from web +62* Удобная функция доступа к каталогу шаблонов из Интернета 
-63  +63* 
-64  This replaces the deprecated DOKU_TPL constant +64* Заменяет устаревшую константу DOKU_TPL 
-65  +65* 
-66  * @param string $tpl The template to usedefault to current one +66* @param  string $ tpl Шаблон для использованияпо умолчанию текущий 
-67  * @return string +67* @возвращаемая  строка 
-68  +68* 
-69  * @author Andreas Gohr <andi@splitbrain.org> +69* @автор Андреас Гор <andi@splitbrain.org> 
-70  */+70*/
 71 function tpl_basedir($tpl = '') 71 function tpl_basedir($tpl = '')
 72 { 72 {
Строка 77: Строка 77:
 76 } 76 }
 77  77 
-78 /** +78/** 
-79  Print the content +79* Распечатать содержимое 
-80  +80* 
-81  This function is used for printing all the usual content +81* Эта функция используется для печати всего обычного контента. 
-82  * (defined by the global $ACT varby calling the appropriate +82* (определяется глобальной переменной $ACT) путем вызова соответствующего 
-83  outputfunction(s) from html.php +83* выходные функции из html.php 
-84  +84* 
-85  Everything that doesn't use the main template file isn't +85* Все, что не использует основной файл шаблона, не 
-86  handled by this function. ACL stuff is not done here either+86* обрабатывается этой функцией. ACL-списки здесь тоже не обрабатываются
-87  +87* 
-88  * @param bool $prependTOC should the TOC be displayed here+88* @param  bool $ prependTOC следует ли здесь отображать оглавление
-89  * @return bool true if any output +89* @return  bool true, если есть какой-либо вывод 
-90  +90* 
-91  * @triggers TPL_ACT_RENDER +91* @triggers TPL_ACT_RENDER 
-92  * @triggers TPL_CONTENT_DISPLAY +92* @triggers TPL_CONTENT_DISPLAY 
-93  * @author Andreas Gohr <andi@splitbrain.org> +93* @автор Андреас Гор <andi@splitbrain.org> 
-94  */+94*/
 95 function tpl_content($prependTOC = true) 95 function tpl_content($prependTOC = true)
 96 { 96 {
Строка 110: Строка 110:
 109 } 109 }
 110  110 
-111 /** +111/** 
-112  Default Action of TPL_ACT_RENDER +112* Действие по умолчанию TPL_ACT_RENDER 
-113  +113* 
-114  * @return bool +114* @return  bool 
-115  */+115*/
 116 function tpl_content_core() 116 function tpl_content_core()
 117 { 117 {
Строка 128: Строка 128:
 127 } 127 }
 128  128 
-129 /** +129/** 
-130  Places the TOC where the function is called +130* Размещает оглавление там, где вызывается функция 
-131  +131* 
-132  If you use this you most probably want to call tpl_content with +132* Если вы используете это, вы, скорее всего, захотите вызвать tpl_content с помощью 
-133  a false argument +133* ложный аргумент 
-134  +134* 
-135  * @param bool $return Should the TOC be returned instead to be printed+135* @param  bool $ return Следует ли вернуть оглавление вместо его печати
-136  * @return string +136* @возвращаемая  строка 
-137  +137* 
-138  * @author Andreas Gohr <andi@splitbrain.org> +138* @автор Андреас Гор <andi@splitbrain.org> 
-139  */+139*/
 140 function tpl_toc($return = false) 140 function tpl_toc($return = false)
 141 { 141 {
Строка 176: Строка 176:
 175 } 175 }
 176  176 
-177 /** +177/** 
-178  Handle the admin page contents +178* Обработка содержимого страницы администратора 
-179  +179* 
-180  * @return bool +180* @return  bool 
-181  +181* 
-182  * @author Andreas Gohr <andi@splitbrain.org> +182* @автор Андреас Гор <andi@splitbrain.org> 
-183  */+183*/
 184 function tpl_admin() 184 function tpl_admin()
 185 { 185 {
Строка 212: Строка 212:
 211 } 211 }
 212  212 
-213 /** +213/** 
-214  Print the correct HTML meta headers +214* Распечатайте правильные HTML-мета-заголовки 
-215  +215* 
-216  This has to go into the head section of your template+216* Это необходимо разместить в заголовке вашего шаблона
-217  +217* 
-218  * @param bool $alt Should feeds and alternative format links be added+218* @param  bool $ alt Нужно ли добавлять каналы и ссылки альтернативного формата
-219  * @return bool +219* @return  bool 
-220  * @throws JsonException +220* @вызывает  JsonException 
-221  +221* 
-222  * @author Andreas Gohr <andi@splitbrain.org> +222* @автор Андреас Гор <andi@splitbrain.org> 
-223  * @triggers TPL_METAHEADER_OUTPUT +223* @triggers TPL_METAHEADER_OUTPUT 
-224  */+224*/
 225 function tpl_metaheaders($alt = true) 225 function tpl_metaheaders($alt = true)
 226 { 226 {
Строка 238: Строка 238:
 237     global $INPUT; 237     global $INPUT;
 238  238 
-239     // prepare the head array+239    // подготавливаем массив головок
 240     $head = []; 240     $head = [];
 241  241 
-242     // prepare seed for js and css+242    // подготовить seed для js и css
 243     $tseed = $updateVersion; 243     $tseed = $updateVersion;
 244     $depends = getConfigFiles('main'); 244     $depends = getConfigFiles('main');
Строка 248: Строка 248:
 247     $tseed = md5($tseed); 247     $tseed = md5($tseed);
 248  248 
-249     // the usual stuff+249    // обычные вещи
 250     $head['meta'][] = ['name' => 'generator', 'content' => 'DokuWiki']; 250     $head['meta'][] = ['name' => 'generator', 'content' => 'DokuWiki'];
 251     if (actionOK('search')) { 251     if (actionOK('search')) {
Строка 336: Строка 336:
 335     } 335     }
 336  336 
-337     // setup robot tags appropriate for different modes+337    // настройка тегов робота, подходящих для разных режимов
 338     if (($ACT == 'show' || $ACT == 'export_xhtml') && !$REV) { 338     if (($ACT == 'show' || $ACT == 'export_xhtml') && !$REV) {
 339         if ($INFO['exists']) { 339         if ($INFO['exists']) {
Строка 359: Строка 359:
 358     } 358     }
 359  359 
-360     // set metadata+360    // установить метаданные
 361     if ($ACT == 'show' || $ACT == 'export_xhtml') { 361     if ($ACT == 'show' || $ACT == 'export_xhtml') {
 362         // keywords (explicit or implicit) 362         // keywords (explicit or implicit)
Строка 369: Строка 369:
 368     } 368     }
 369  369 
-370     // load stylesheets+370    // загрузка таблиц стилей
 371     $head['link'][] = [ 371     $head['link'][] = [
 372         'rel' => 'stylesheet', 372         'rel' => 'stylesheet',
Строка 384: Строка 384:
 383     $head['script'][] = ['_data' => $script]; 383     $head['script'][] = ['_data' => $script];
 384  384 
-385     // load jquery+385    // загрузить jquery
 386     $jquery = getCdnUrls(); 386     $jquery = getCdnUrls();
 387     foreach ($jquery as $src) { 387     foreach ($jquery as $src) {
Строка 393: Строка 393:
 392     } 392     }
 393  393 
-394     // load our javascript dispatcher+394    // загружаем наш диспетчер javascript
 395     $head['script'][] = [ 395     $head['script'][] = [
 396             '_data' => '', 396             '_data' => '',
Строка 399: Строка 399:
 398         ] + ($conf['defer_js'] ? ['defer' => 'defer'] : []); 398         ] + ($conf['defer_js'] ? ['defer' => 'defer'] : []);
 399  399 
-400     // trigger event here+400    // вызвать событие здесь
 401     Event::createAndTrigger('TPL_METAHEADER_OUTPUT', $head, '_tpl_metaheaders_action', true); 401     Event::createAndTrigger('TPL_METAHEADER_OUTPUT', $head, '_tpl_metaheaders_action', true);
 402     return true; 402     return true;
 403 } 403 }
 404  404 
-405 /** +405/** 
-406  prints the array build by tpl_metaheaders +406* печатает массив, созданный tpl_metaheaders 
-407  +407* 
-408  * $data is an array of different header tagsEach tag can have multiple +408* $data — это массив различных тегов заголовковКаждый тег может иметь несколько 
-409  instancesAttributes are given as key value pairsValues will be HTML +409* экземплярыАтрибуты задаются как пары ключ-значениеЗначения будут HTML 
-410  encoded automatically so they should be provided as is in the $data array+410* кодируются автоматически, поэтому их следует предоставлять как есть в массиве $data. 
-411  +411* 
-412  For tags having a body attribute specify the body data in the special +412* Для тегов, имеющих атрибут body, укажите данные body в специальном поле 
-413  attribute '_data'This field will NOT BE ESCAPED automatically+413* атрибут '_data'Это поле НЕ БУДЕТ ЭКРАНИРОВАНО автоматически
-414  +414* 
-415  Inline scripts will use any nonce provided in the environment variable 'NONCE'+415* Встроенные скрипты будут использовать любой одноразовый номер, указанный в переменной среды «NONCE»
-416  +416* 
-417  * @param array $data +417* @param  массив данные 
-418  +418* 
-419  * @author Andreas Gohr <andi@splitbrain.org> +419* @автор Андреас Гор <andi@splitbrain.org> 
-420  */+420*/
 421 function _tpl_metaheaders_action($data) 421 function _tpl_metaheaders_action($data)
 422 { 422 {
Строка 442: Строка 442:
 441 } 441 }
 442  442 
-443 /** +443/** 
-444  Output the given script as inline script tag +444* Вывести данный скрипт как встроенный тег скрипта 
-445  +445* 
-446  This function will add the nonce attribute if a nonce is available+446* Эта функция добавит атрибут nonce, если он доступен
-447  +447* 
-448  The script is NOT automatically escaped+448* Скрипт НЕ экранируется автоматически
-449  +449* 
-450  * @param string $script +450* @param  string $ скрипт 
-451  * @param bool $return Return or print directly+451* @param  bool $ return Возврат или прямая печать
-452  * @return string|void +452* @return  string | недействительный 
-453  */+453*/
 454 function tpl_inlineScript($script, $return = false) 454 function tpl_inlineScript($script, $return = false)
 455 { 455 {
Строка 466: Строка 466:
 465 } 465 }
 466  466 
-467 /** +467/** 
-468  Print a link +468* Распечатать ссылку 
-469  +469* 
-470  Just builds a link+470* Просто создает ссылку
-471  +471* 
-472  * @param string $url +472* @param  string $ url 
-473  * @param string $name +473* @param  string $ имя 
-474  * @param string $more +474* @param  string $ еще 
-475  * @param bool $return if true return the link html, otherwise print +475* @param  bool $ return если true вернуть ссылку html, в противном случае вывести 
-476  * @return bool|string html of the linkor true if printed +476* @return  bool | строка html ссылки или trueесли выводится 
-477  +477* 
-478  * @author Andreas Gohr <andi@splitbrain.org> +478* @автор Андреас Гор <andi@splitbrain.org> 
-479  */+479*/
 480 function tpl_link($url, $name, $more = '', $return = false) 480 function tpl_link($url, $name, $more = '', $return = false)
 481 { 481 {
Строка 489: Строка 489:
 488 } 488 }
 489  489 
-490 /** +490/** 
-491  Prints a link to a WikiPage +491* Печатает ссылку на WikiPage 
-492  +492* 
-493  Wrapper around html_wikilink +493* Обертка вокруг html_wikilink 
-494  +494* 
-495  * @param string $id page id +495* @param  string $ id идентификатор страницы 
-496  * @param string|null $name the name of the link +496* @param  string | null $ name имя ссылки 
-497  * @param bool $return +497* @param  bool $ возврат 
-498  * @return true|string +498* @return  true | строка 
-499  +499* 
-500  * @author Andreas Gohr <andi@splitbrain.org> +500* @автор Андреас Гор <andi@splitbrain.org> 
-501  */+501*/
 502 function tpl_pagelink($id, $name = null, $return = false) 502 function tpl_pagelink($id, $name = null, $return = false)
 503 { 503 {
Строка 509: Строка 509:
 508 } 508 }
 509  509 
-510 /** +510/** 
-511  get the parent page +511* получить родительскую страницу 
-512  +512* 
-513  Tries to find out which page is parent+513* Пытается выяснить, какая страница является родительской
-514  returns false if none is available +514* возвращает false, если ничего не доступно 
-515  +515* 
-516  * @param string $id page id +516* @param  string $ id идентификатор страницы 
-517  * @return false|string +517* @return  false | строка 
-518  +518* 
-519  * @author Andreas Gohr <andi@splitbrain.org> +519* @автор Андреас Гор <andi@splitbrain.org> 
-520  */+520*/
 521 function tpl_getparent($id) 521 function tpl_getparent($id)
 522 { 522 {
Строка 535: Строка 535:
 534 } 534 }
 535  535 
-536 /** +536/** 
-537  Print one of the buttons +537* Распечатать одну из кнопок 
-538  +538* 
-539  * @param string $type +539* @param  string $ тип 
-540  * @param bool $return +540* @param  bool $ возврат 
-541  * @return bool|string html, or false if no data, true if printed +541* @return  bool | string html, или false, если данных нет, true, если выведено 
-542  * @see    tpl_get_action +542* @see     tpl_get_action 
-543  +543* 
-544  * @author Adrian Lang <mail@adrianlang.de> +544* @автор Адриан Лэнг <mail@adrianlang.de> 
-545  * @deprecated 2017-09-01 see devel:menus +545* @deprecated 2017-09-01 см. devel:menus 
-546  */+546*/
 547 function tpl_button($type, $return = false) 547 function tpl_button($type, $return = false)
 548 { 548 {
Строка 573: Строка 573:
 572 } 572 }
 573  573 
-574 /** +574/** 
-575  Like the action buttons but links +575* Как кнопки действий, но ссылки 
-576  +576* 
-577  * @param string $type action command +577* @param  string $ тип действие команда 
-578  * @param string $pre prefix of link +578* @param  string $ pre префикс ссылки 
-579  * @param string $suf suffix of link +579* @param  string $ suf суффикс ссылки 
-580  * @param string $inner innerHML of link +580* @param  string $ внутренний innerHML ссылки 
-581  * @param bool $return if true it returns html, otherwise prints +581* @param  bool $ return если true, то возвращает html, в противном случае печатает 
-582  * @return bool|string html or false if no data, true if printed +582* @return  bool | string html или false, если данных нет, true, если выведено 
-583  +583* 
-584  * @see    tpl_get_action +584* @see     tpl_get_action 
-585  * @author Adrian Lang <mail@adrianlang.de> +585* @автор Адриан Лэнг <mail@adrianlang.de> 
-586  * @deprecated 2017-09-01 see devel:menus +586* @deprecated 2017-09-01 см. devel:menus 
-587  */+587*/
 588 function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = false) 588 function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = false)
 589 { 589 {
Строка 636: Строка 636:
 635 } 635 }
 636  636 
-637 /** +637/** 
-638  Check the actions and get data for buttons and links +638* Проверьте действия и получите данные для кнопок и ссылок 
-639  +639* 
-640  * @param string $type +640* @param  string $ тип 
-641  * @return array|bool|string +641* @return  массив | bool | строка 
-642  +642* 
-643  * @author Adrian Lang <mail@adrianlang.de> +643* @автор Адриан Лэнг <mail@adrianlang.de> 
-644  * @author Andreas Gohr <andi@splitbrain.org> +644* @автор Андреас Гор <andi@splitbrain.org> 
-645  * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> +645* @автор Маттиас Гримм <matthiasgrimm@users.sourceforge.net> 
-646  * @deprecated 2017-09-01 see devel:menus +646* @deprecated 2017-09-01 см. devel:menus 
-647  */+647*/
 648 function tpl_get_action($type) 648 function tpl_get_action($type)
 649 { 649 {
Строка 691: Строка 691:
 690 } 690 }
 691  691 
-692 /** +692/** 
-693  Wrapper around tpl_button() and tpl_actionlink() +693* Обертка вокруг tpl_button() и tpl_actionlink() 
-694  +694* 
-695  * @param string $type action command +695* @param  string $ тип действие команда 
-696  * @param bool $link link or form button+696* @param  bool $ ссылка ссылка или кнопка формы
-697  * @param string|bool $wrapper HTML element wrapper +697* @param  string | bool $ wrapper Обертка HTML-элемента 
-698  * @param bool $return return or print +698* @param  bool $ return return или print 
-699  * @param string $pre prefix for links +699* @param  string $ pre префикс для ссылок 
-700  * @param string $suf suffix for links +700* @param  string $ suf суффикс для ссылок 
-701  * @param string $inner inner HTML for links +701* @param  string $ внутренний внутренний HTML для ссылок 
-702  * @return bool|string +702* @return  bool | строка 
-703  +703* 
-704  * @author Anika Henke <anika@selfthinker.org> +704* @автор Аника Хенке <anika@selfthinker.org> 
-705  * @deprecated 2017-09-01 see devel:menus +705* @deprecated 2017-09-01 см. devel:menus 
-706  */+706*/
 707 function tpl_action($type, $link = false, $wrapper = false, $return = false, $pre = '', $suf = '', $inner = '') 707 function tpl_action($type, $link = false, $wrapper = false, $return = false, $pre = '', $suf = '', $inner = '')
 708 { 708 {
Строка 722: Строка 722:
 721 } 721 }
 722  722 
-723 /** +723/** 
-724  Print the search form +724* Распечатать форму поиска 
-725  +725* 
-726  If the first parameter is given a div with the ID 'qsearch_out' will +726* Если первый параметр задан как div с идентификатором 'qsearch_out', то будет 
-727  be added which instructs the ajax pagequicksearch to kick in and place +727* добавляется, который инструктирует страницу ajax quicksearch включиться и разместить 
-728  its output into this div. The second parameter controls the propritary +728* его вывод в этот div. Второй параметр управляет собственным 
-729  attribute autocompleteIf set to false this attribute will be set with an +729* атрибут автозаполненияЕсли установлено значение false, этот атрибут будет установлен с 
-730  value of "off" to instruct the browser to disable it's own built in +730* значение "off" указывает браузеру отключить встроенные функции 
-731  autocompletion feature (MSIE and Firefox) +731* функция автодополнения (MSIE и Firefox) 
-732  +732* 
-733  * @param bool $ajax +733* @param  bool $ ajax 
-734  * @param bool $autocomplete +734* @param  bool $ автозаполнение 
-735  * @return bool +735* @return  bool 
-736  +736* 
-737  * @author Andreas Gohr <andi@splitbrain.org> +737* @автор Андреас Гор <andi@splitbrain.org> 
-738  */+738*/
 739 function tpl_searchform($ajax = true, $autocomplete = true) 739 function tpl_searchform($ajax = true, $autocomplete = true)
 740 { 740 {
Строка 784: Строка 784:
 783 } 783 }
 784  784 
-785 /** +785/** 
-786  Print the breadcrumbs trace +786* Распечатать след навигационной цепочки 
-787  +787* 
-788  * @param string $sep Separator between entries +788* @param  string $ sep Разделитель между записями 
-789  * @param bool $return return or print +789* @param  bool $ return return или print 
-790  * @return bool|string +790* @return  bool | строка 
-791  +791* 
-792  * @author Andreas Gohr <andi@splitbrain.org> +792* @автор Андреас Гор <andi@splitbrain.org> 
-793  */+793*/
 794 function tpl_breadcrumbs($sep = null, $return = false) 794 function tpl_breadcrumbs($sep = null, $return = false)
 795 { 795 {
Строка 826: Строка 826:
 825 } 825 }
 826  826 
-827 /** +827/** 
-828  Hierarchical breadcrumbs +828* Иерархическая навигационная цепочка 
-829  +829* 
-830  This code was suggested as replacement for the usual breadcrumbs+830* Этот код был предложен в качестве замены обычным хлебным крошкам
-831  It only makes sense with a deep site structure+831* Имеет смысл только при наличии глубокой структуры сайта
-832  +832* 
-833  * @param string $sep Separator between entries +833* @param  string $ sep Разделитель между записями 
-834  * @param bool $return return or print +834* @param  bool $ return return или print 
-835  * @return bool|string +835* @return  bool | строка 
-836  +836* 
-837  * @todo   May behave strangely in RTL languages +837* @todo    может вести себя странно в языках с письмом справа налево 
-838  * @author <fredrik@averpil.com> +838* @автор <fredrik@averpil.com> 
-839  * @author Andreas Gohr <andi@splitbrain.org> +839* @автор Андреас Гор <andi@splitbrain.org> 
-840  * @author Nigel McNie <oracle.shinoda@gmail.com> +840* @автор Найджел Макни <oracle.shinoda@gmail.com> 
-841  * @author Sean Coates <sean@caedmon.net> +841* @автор Шон Коутс <sean@caedmon.net> 
-842  */+842*/
 843 function tpl_youarehere($sep = null, $return = false) 843 function tpl_youarehere($sep = null, $return = false)
 844 { 844 {
Строка 897: Строка 897:
 896 } 896 }
 897  897 
-898 /** +898/** 
-899  Print info if the user is logged in +899* Распечатать информацию, если пользователь вошел в систему 
-900  and show full name in that case +900* и в этом случае показывать полное имя 
-901  +901* 
-902  Could be enhanced with a profile link in future+902* Можно ли в будущем добавить ссылку на профиль
-903  +903* 
-904  * @return bool +904* @return  bool 
-905  +905* 
-906  * @author Andreas Gohr <andi@splitbrain.org> +906* @автор Андреас Гор <andi@splitbrain.org> 
-907  */+907*/
 908 function tpl_userinfo() 908 function tpl_userinfo()
 909 { 909 {
Строка 920: Строка 920:
 919 } 919 }
 920  920 
-921 /** +921/** 
-922  Print some info about the current page +922* Распечатать некоторую информацию о текущей странице 
-923  +923* 
-924  * @param bool $ret return content instead of printing it +924* @param  bool $ ret возвращает содержимое вместо его печати 
-925  * @return bool|string +925* @return  bool | строка 
-926  +926* 
-927  * @author Andreas Gohr <andi@splitbrain.org> +927* @автор Андреас Гор <andi@splitbrain.org> 
-928  */+928*/
 929 function tpl_pageinfo($ret = false) 929 function tpl_pageinfo($ret = false)
 930 { 930 {
Строка 981: Строка 981:
 980 } 980 }
 981  981 
-982 /** +982/** 
-983  Prints or returns the name of the given page (current one if none given). +983* Печатает или возвращает имя указанной страницы (текущей, если не указано). 
-984  +984* 
-985  If useheading is enabled this will use the first headline else +985* Если включено использование заголовка, будет использоваться первый заголовок, в противном случае 
-986  the given ID is used+986* используется указанный идентификатор
-987  +987* 
-988  * @param string $id page id +988* @param  string $ id идентификатор страницы 
-989  * @param bool $ret return content instead of printing +989* @param  bool $ ret возвращает содержимое вместо печати 
-990  * @return bool|string +990* @return  bool | строка 
-991  +991* 
-992  * @author Andreas Gohr <andi@splitbrain.org> +992* @автор Андреас Гор <andi@splitbrain.org> 
-993  */+993*/
 994 function tpl_pagetitle($id = null, $ret = false) 994 function tpl_pagetitle($id = null, $ret = false)
 995 { 995 {
Строка 1061: Строка 1061:
 1060 } 1060 }
 1061  1061 
-1062 /** +1062/** 
-1063  Returns the requested EXIF/IPTC tag from the current image +1063* Возвращает запрошенный тег EXIF / IPTC из текущего изображения 
-1064  +1064* 
-1065  If $tags is an array all given tags are tried until a +1065* Если $tags — это массив, то все заданные теги проверяются до тех пор, пока не будет найден 
-1066  value is foundIf no value is found $alt is returned+1066* значение найденоЕсли значение не найдено, возвращается $alt. 
-1067  +1067* 
-1068  Which texts are known is defined in the functions _exifTagNames +1068* Какие тексты известны, определяется в функциях _exifTagNames 
-1069  and _iptcTagNames() in inc/jpeg.php (You need to prepend IPTC +1069* и _iptcTagNames() в inc / jpeg.php (Вам необходимо добавить IPTC 
-1070  to the names of the latter one+1070* к именам последнего
-1071  +1071* 
-1072  Only allowed in: detail.php +1072* Разрешено только в: detail.php 
-1073  +1073* 
-1074  * @param array|string $tags tag or array of tags to try +1074* @param  array | string $ tags тег или массив тегов для проверки 
-1075  * @param string $alt alternative output if no data was found +1075* @param  string $ alt альтернативный вывод, если данные не найдены 
-1076  * @param null|string $src the image srcuses global $SRC if not given +1076* @param  null | string $ src источник изображения, если не указаниспользуется глобальный $SRC 
-1077  * @return string +1077* @возвращаемая  строка 
-1078  +1078* 
-1079  * @author Andreas Gohr <andi@splitbrain.org> +1079* @автор Андреас Гор <andi@splitbrain.org> 
-1080  */+1080*/
 1081 function tpl_img_getTag($tags, $alt = '', $src = null) 1081 function tpl_img_getTag($tags, $alt = '', $src = null)
 1082 { 1082 {
Строка 1098: Строка 1098:
 1097  1097 
 1098  1098 
-1099 /** +1099/** 
-1100  Garbage collects up the open JpegMeta object+1100* Мусор собирает открытый объект JpegMeta. 
-1101  */+1101*/
 1102 function tpl_img_close() 1102 function tpl_img_close()
 1103 { 1103 {
Строка 1107: Строка 1107:
 1106 } 1106 }
 1107  1107 
-1108 /** +1108/** 
-1109  Prints a html description list of the metatags of the current image +1109* Выводит HTML-список описаний метатегов текущего изображения 
-1110  */+1110*/
 1111 function tpl_img_meta() 1111 function tpl_img_meta()
 1112 { 1112 {
Строка 1132: Строка 1132:
 1131 } 1131 }
 1132  1132 
-1133 /** +1133/** 
-1134  Returns metadata as configured in mediameta config fileready for creating html +1134* Возвращает метаданные, настроенные в файле конфигурации mediameta, готовые для создания html 
-1135  +1135* 
-1136  * @return array with arrays containing the entries+1136* @return  массив с массивами, содержащими записи
-1137    string langkey  key to lookup in the $lang varif not found printed as is +1137* - строка langkey key для поиска в переменной $lang, если не найдена, выводится как есть 
-1138    string type     type of value +1138* - строковый тип значения 
-1139    string value    tag value (unescaped+1139* - строковое значение тега (неэкранированное
-1140  */+1140*/
 1141 function tpl_get_img_meta() 1141 function tpl_get_img_meta()
 1142 { 1142 {
Строка 1166: Строка 1166:
 1165 } 1165 }
 1166  1166 
-1167 /** +1167/** 
-1168  Prints the image with a link to the full sized version +1168* Печатает изображение со ссылкой на полноразмерную версию 
-1169  +1169* 
-1170  Only allowed in: detail.php +1170* Разрешено только в: detail.php 
-1171  +1171* 
-1172  * @triggers TPL_IMG_DISPLAY +1172* @triggers TPL_IMG_DISPLAY 
-1173  * @param int $maxwidth - maximal width of the image +1173* @param  int $ maxwidth - максимальная ширина изображения 
-1174  * @param int $maxheight - maximal height of the image +1174* @param  int $ maxheight - максимальная высота изображения 
-1175  * @param bool $link - link to the orginal size+1175* @param  bool $ link - ссылка на исходный размер
-1176  * @param array $params - additional image attributes +1176* @param  array $ params - дополнительные атрибуты изображения 
-1177  * @return bool Result of TPL_IMG_DISPLAY +1177* @return  bool Результат TPL_IMG_DISPLAY 
-1178  */+1178*/
 1179 function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) 1179 function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null)
 1180 { 1180 {
Строка 1187: Строка 1187:
 1186     $h = (int)tpl_img_getTag('File.Height'); 1186     $h = (int)tpl_img_getTag('File.Height');
 1187  1187 
-1188     //resize to given max values+1188    //изменить размер до указанных максимальных значений
 1189     $ratio = 1; 1189     $ratio = 1;
 1190     if ($w >= $h) { 1190     if ($w >= $h) {
Строка 1205: Строка 1205:
 1204     } 1204     }
 1205  1205 
-1206     //prepare URLs+1206    //подготовить URL-адреса
 1207     $url = ml($IMG, ['cache' => $INPUT->str('cache'), 'rev' => $REV], true, '&'); 1207     $url = ml($IMG, ['cache' => $INPUT->str('cache'), 'rev' => $REV], true, '&');
 1208     $src = ml($IMG, ['cache' => $INPUT->str('cache'), 'rev' => $REV, 'w' => $w, 'h' => $h], true, '&'); 1208     $src = ml($IMG, ['cache' => $INPUT->str('cache'), 'rev' => $REV, 'w' => $w, 'h' => $h], true, '&');
 1209  1209 
-1210     //prepare attributes+1210    //подготовить атрибуты
 1211     $alt = tpl_img_getTag('Simple.Title'); 1211     $alt = tpl_img_getTag('Simple.Title');
 1212     if (is_null($params)) { 1212     if (is_null($params)) {
Строка 1231: Строка 1231:
 1230 } 1230 }
 1231  1231 
-1232 /** +1232/** 
-1233  Default action for TPL_IMG_DISPLAY +1233* Действие по умолчанию для TPL_IMG_DISPLAY 
-1234  +1234* 
-1235  * @param array $data +1235* @param  массив данные 
-1236  * @return bool +1236* @return  bool 
-1237  */+1237*/
 1238 function _tpl_img_action($data) 1238 function _tpl_img_action($data)
 1239 { 1239 {
Строка 1248: Строка 1248:
 1247 } 1247 }
 1248  1248 
-1249 /** +1249/** 
-1250  This function inserts a small gif which in reality is the indexer function+1250* Эта функция вставляет небольшой gif-файл, который на самом деле является функцией индексатора
-1251  +1251* 
-1252  Should be called somewhere at the very end of the main.php template +1252* Должен вызываться где-то в самом конце шаблона main.php 
-1253  +1253* 
-1254  * @return bool +1254* @return  bool 
-1255  */+1255*/
 1256 function tpl_indexerWebBug() 1256 function tpl_indexerWebBug()
 1257 { 1257 {
Строка 1270: Строка 1270:
 1269 } 1269 }
 1270  1270 
-1271 /** +1271/** 
-1272  * tpl_getConf($id) +1272* tpl_getConf($id) 
-1273  +1273* 
-1274  use this function to access template configuration variables +1274* используйте эту функцию для доступа к переменным конфигурации шаблона 
-1275  +1275* 
-1276  * @param string $id name of the value to access +1276* @param  string $ id имя значения для доступа 
-1277  * @param mixed $notset what to return if the setting is not available +1277* @param  mixed $ notset что возвращать, если настройка недоступна 
-1278  * @return mixed +1278* @return  смешанный 
-1279  */+1279*/
 1280 function tpl_getConf($id, $notset = false) 1280 function tpl_getConf($id, $notset = false)
 1281 { 1281 {
Строка 1300: Строка 1300:
 1299 } 1299 }
 1300  1300 
-1301 /** +1301/** 
-1302  * tpl_loadConfig() +1302* tpl_loadConfig() 
-1303  +1303* 
-1304  reads all template configuration variables +1304* считывает все переменные конфигурации шаблона 
-1305  this function is automatically called by tpl_getConf() +1305* эта функция автоматически вызывается tpl_getConf() 
-1306  +1306* 
-1307  * @return false|array +1307* @return  false | массив 
-1308  */+1308*/
 1309 function tpl_loadConfig() 1309 function tpl_loadConfig()
 1310 { 1310 {
Строка 1316: Строка 1316:
 1315     if (!file_exists($file)) return false; 1315     if (!file_exists($file)) return false;
 1316  1316 
-1317     // load default config file+1317    // загрузить файл конфигурации по умолчанию
 1318     include($file); 1318     include($file);
 1319  1319 
Строка 1322: Строка 1322:
 1321 } 1321 }
 1322  1322 
-1323 // language methods+1323// методы языка
 1324  1324 
-1325 /** +1323// методы языка 
-1326  * tpl_getLang($id) +1324 
-1327  +1325/** 
-1328  use this function to access template language variables +1326* tpl_getLang($id) 
-1329  +1327* 
-1330  * @param string $id key of language string +1328* используйте эту функцию для доступа к переменным языка шаблона 
-1331  * @return string +1329* 
-1332  */+1330* @param  string $ id ключ языковой строки 
 +1331* @возвращаемая  строка 
 +1332*/
 1333 function tpl_getLang($id) 1333 function tpl_getLang($id)
 1334 { 1334 {
Строка 1343: Строка 1345:
 1342         $lang = []; 1342         $lang = [];
 1343  1343 
-1344         // don't include once+1344        // не включайте один раз
 1345         @include($path . 'en/lang.php'); 1345         @include($path . 'en/lang.php');
 1346         foreach ($config_cascade['lang']['template'] as $config_file) { 1346         foreach ($config_cascade['lang']['template'] as $config_file) {
Строка 1363: Строка 1365:
 1362 } 1362 }
 1363  1363 
-1364 /** +1364/** 
-1365  Retrieve a language dependent file and pass to xhtml renderer for display +1365* Извлечь файл, зависящий от языка, и передать его в xhtml-рендерер для отображения 
-1366  template equivalent of p_locale_xhtml() +1366* эквивалент шаблона p_locale_xhtml() 
-1367  +1367* 
-1368  * @param string $id id of language dependent wiki page +1368* @param  string $ id идентификатор страницы вики, зависящей от языка 
-1369  * @return  string     parsed contents of the wiki page in xhtml format +1369* @return   string      анализирует содержимое страницы вики в формате xhtml 
-1370  */+1370*/
 1371 function tpl_locale_xhtml($id) 1371 function tpl_locale_xhtml($id)
 1372 { 1372 {
Строка 1375: Строка 1377:
 1374 } 1374 }
 1375  1375 
-1376 /** +1376/** 
-1377  Prepends appropriate path for a language dependent filename +1377* Добавляет соответствующий путь к имени файла, зависящему от языка 
-1378  +1378* 
-1379  * @param string $id id of localized text +1379* @param  string $ id идентификатор локализованного текста 
-1380  * @return string wiki text +1380* @return  string вики-текст 
-1381  */+1381*/
 1382 function tpl_localeFN($id) 1382 function tpl_localeFN($id)
 1383 { 1383 {
Строка 1396: Строка 1398:
 1395 } 1395 }
 1396  1396 
-1397 /** +1397/** 
-1398  prints the "main content" in the mediamanager popup +1398* выводит «основной контент» во всплывающем окне медиаменеджера 
-1399  +1399* 
-1400  Depending on the user's actions this may be a list of +1400* В зависимости от действий пользователя это может быть список 
-1401  files in a namespacethe meta editing dialog or +1401* файлы в пространстве имендиалоговое окно редактирования метаданных или 
-1402  a message of referencing pages +1402* сообщение о ссылках на страницы 
-1403  +1403* 
-1404  Only allowed in mediamanager.php +1404* Разрешено только в mediamanager.php 
-1405  +1405* 
-1406  * @triggers MEDIAMANAGER_CONTENT_OUTPUT +1406* @triggers МЕДИАМЕНЕДЖЕР_КОНТЕНТ_ВЫВОД 
-1407  * @param bool $fromajax - set true when calling this function via ajax +1407* @param  bool $ fromajax - установить true при вызове этой функции через ajax 
-1408  * @param string $sort +1408* @param  string $ сортировка 
-1409  +1409* 
-1410  * @author Andreas Gohr <andi@splitbrain.org> +1410* @автор Андреас Гор <andi@splitbrain.org> 
-1411  */+1411*/
 1412 function tpl_mediaContent($fromajax = false, $sort = 'natural') 1412 function tpl_mediaContent($fromajax = false, $sort = 'natural')
 1413 { 1413 {
Строка 1434: Строка 1436:
 1433     } 1433     }
 1434  1434 
-1435     // output the content panewrapped in an event.+1435    // выводим панель содержимогообернутую в событие.
 1436     if (!$fromajax) echo '<div id="media__content">'; 1436     if (!$fromajax) echo '<div id="media__content">';
 1437     $data = ['do' => $do]; 1437     $data = ['do' => $do];
Строка 1455: Строка 1457:
 1454 } 1454 }
 1455  1455 
-1456 /** +1456/** 
-1457  Prints the central column in full-screen media manager +1457* Печатает центральный столбец в полноэкранном медиа-менеджере 
-1458  Depending on the opened tab this may be a list of +1458* В зависимости от открытой вкладки это может быть список 
-1459  files in a namespaceupload form or search form +1459* файлы в пространстве именформа загрузки или форма поиска 
-1460  +1460* 
-1461  * @author Kate Arzamastseva <pshns@ukr.net> +1461* @author Катя Арзамасцева <pshns@ukr.net> 
-1462  */+1462*/
 1463 function tpl_mediaFileList() 1463 function tpl_mediaFileList()
 1464 { 1464 {
Строка 1500: Строка 1502:
 1499 } 1499 }
 1500  1500 
-1501 /** +1501/** 
-1502  Prints the third column in full-screen media manager +1502* Печатает третий столбец в полноэкранном медиа-менеджере 
-1503  Depending on the opened tab this may be details of the +1503* В зависимости от открытой вкладки это могут быть сведения о 
-1504  selected filethe meta editing dialog or +1504* выбранный файлдиалоговое окно редактирования метаданных или 
-1505  list of file revisions +1505* список ревизий файлов 
-1506  +1506* 
-1507  * @param string $image +1507* @param  string $ изображение 
-1508  * @param boolean $rev +1508* @param  boolean $ rev 
-1509  +1509* 
-1510  * @author Kate Arzamastseva <pshns@ukr.net> +1510* @author Катя Арзамасцева <pshns@ukr.net> 
-1511  */+1511*/
 1512 function tpl_mediaFileDetails($image, $rev) 1512 function tpl_mediaFileDetails($image, $rev)
 1513 { 1513 {
Строка 1578: Строка 1580:
 1577 } 1577 }
 1578  1578 
-1579 /** +1579/** 
-1580  prints the namespace tree in the mediamanager popup +1580* выводит дерево пространства имен во всплывающем окне медиаменеджера 
-1581  +1581* 
-1582  Only allowed in mediamanager.php +1582* Разрешено только в mediamanager.php 
-1583  +1583* 
-1584  * @author Andreas Gohr <andi@splitbrain.org> +1584* @автор Андреас Гор <andi@splitbrain.org> 
-1585  */+1585*/
 1586 function tpl_mediaTree() 1586 function tpl_mediaTree()
 1587 { 1587 {
Строка 1593: Строка 1595:
 1592 } 1592 }
 1593  1593 
-1594 /** +1594/** 
-1595  Print a dropdown menu with all DokuWiki actions +1595* Распечатать выпадающее меню со всеми действиями DokuWiki 
-1596  +1596* 
-1597  Notethis will not use any pretty URLs +1597* Примечаниездесь не будут использоваться красивые URL-адреса. 
-1598  +1598* 
-1599  * @param string $empty empty option label +1599* @param  string $ пусто пустая метка параметра 
-1600  * @param string $button submit button label +1600* @param  string $ кнопка подписи кнопки отправки 
-1601  +1601* 
-1602  * @author Andreas Gohr <andi@splitbrain.org> +1602* @автор Андреас Гор <andi@splitbrain.org> 
-1603  * @deprecated 2017-09-01 see devel:menus +1603* @deprecated 2017-09-01 см. devel:menus 
-1604  */+1604*/
 1605 function tpl_actiondropdown($empty = '', $button = '&gt;') 1605 function tpl_actiondropdown($empty = '', $button = '&gt;')
 1606 { 1606 {
Строка 1611: Строка 1613:
 1610 } 1610 }
 1611  1611 
-1612 /** +1612/** 
-1613  Print a informational line about the used license +1613* Распечатать информационную строку об использованной лицензии 
-1614  +1614* 
-1615  * @param string $img print image? (|button|badge+1615* @param  string $ img распечатать изображение? (|кнопка|значок
-1616  * @param bool $imgonly skip the textual description+1616* @param  bool $ imgonly пропустить текстовое описание
-1617  * @param bool $return when true don't printbut return HTML +1617* @param  bool $ return, если true, не печатать, а возвращать HTML 
-1618  * @param bool $wrap wrap in div with class="license"? +1618* @param  bool $ обернуть в div с class="license"? 
-1619  * @return string +1619* @возвращаемая  строка 
-1620  +1620* 
-1621  * @author Andreas Gohr <andi@splitbrain.org> +1621* @автор Андреас Гор <andi@splitbrain.org> 
-1622  */+1622*/
 1623 function tpl_license($img = 'badge', $imgonly = false, $return = false, $wrap = true) 1623 function tpl_license($img = 'badge', $imgonly = false, $return = false, $wrap = true)
 1624 { 1624 {
Строка 1654: Строка 1656:
 1653 } 1653 }
 1654  1654 
-1655 /** +1655/** 
-1656  Includes the rendered HTML of a given page +1656* Включает визуализированный HTML-код указанной страницы 
-1657  +1657* 
-1658  This function is useful to populate sidebars or similar features in a +1658* Эта функция полезна для заполнения боковых панелей или подобных функций в 
-1659  template +1659* шаблон 
-1660  +1660* 
-1661  * @param string $pageid The page name you want to include +1661* @param  string $ pageid Имя страницы, которую вы хотите включить 
-1662  * @param bool $print Should the content be printed or returned only +1662* @param  bool $ print Следует ли печатать содержимое или только возвращать его 
-1663  * @param bool $propagate Search higher namespaces, too+1663* @param  bool $ propagate Искать также и в более высоких пространствах имен
-1664  * @param bool $useacl Include the page only if the ACLs check out+1664* @param  bool $ useacl Включать страницу только в том случае, если списки контроля доступа проверены
-1665  * @return bool|null|string +1665* @return  bool | null | строка 
-1666  */+1666*/
 1667 function tpl_include_page($pageid, $print = true, $propagate = false, $useacl = true) 1667 function tpl_include_page($pageid, $print = true, $propagate = false, $useacl = true)
 1668 { 1668 {
Строка 1684: Строка 1686:
 1683 } 1683 }
 1684  1684 
-1685 /** +1685/** 
-1686  Display the subscribe form +1686* Отобразить форму подписки 
-1687  +1687* 
-1688  * @author Adrian Lang <lang@cosmocode.de> +1688* @автор Адриан Лэнг <lang@cosmocode.de> 
-1689  * @deprecated 2020-07-23 +1689* @устаревший 2020-07-23 
-1690  */+1690*/
 1691 function tpl_subscribe() 1691 function tpl_subscribe()
 1692 { 1692 {
Строка 1696: Строка 1698:
 1695 } 1695 }
 1696  1696 
-1697 /** +1697/** 
-1698  Tries to send already created content right to the browser +1698* Пытается отправить уже созданный контент прямо в браузер 
-1699  +1699* 
-1700  Wraps around ob_flush() and flush() +1700* Оборачивает ob_flush() и flush() 
-1701  +1701* 
-1702  * @author Andreas Gohr <andi@splitbrain.org> +1702* @автор Андреас Гор <andi@splitbrain.org> 
-1703  */+1703*/
 1704 function tpl_flush() 1704 function tpl_flush()
 1705 { 1705 {
Строка 1709: Строка 1711:
 1708 } 1708 }
 1709  1709 
-1710 /** +1710/** 
-1711  Tries to find a ressource file in the given locations+1711* Пытается найти файл ресурсов в указанных местах
-1712  +1712* 
-1713  If a given location starts with a colon it is assumed to be a media +1713* Если указанное местоположение начинается с двоеточия, предполагается, что это медиа 
-1714  fileotherwise it is assumed to be relative to the current template +1714* файлв противном случае предполагается, что он относится к текущему шаблону 
-1715  +1715* 
-1716  * @param string[] $search locations to look at +1716* @параметр  строка []$ поиск мест для просмотра 
-1717  * @param bool $abs if to use absolute URL +1717* @param  bool $ abs , если использовать абсолютный URL 
-1718  * @param array    &$imginfo filled with getimagesize() +1718* @param  массив     &$imginfo заполнен с помощью getimagesize() 
-1719  * @param bool $fallback use fallback image if target isn't found or return 'false' if potential +1719* @param  bool $ fallback использовать резервное изображение, если цель не найдена, или вернуть «false», если она потенциальная 
-1720                                 false result is required +1720* требуется ложный результат 
-1721  * @return string +1721* @возвращаемая  строка 
-1722  +1722* 
-1723  * @author Andreas  Gohr <andi@splitbrain.org> +1723* @автор Андреас Гор <andi@splitbrain.org> 
-1724  */+1724*/
 1725 function tpl_getMediaFile($search, $abs = false, &$imginfo = null, $fallback = true) 1725 function tpl_getMediaFile($search, $abs = false, &$imginfo = null, $fallback = true)
 1726 { 1726 {
Строка 1729: Строка 1731:
 1728     $file = ''; 1728     $file = '';
 1729     $ismedia = false; 1729     $ismedia = false;
-1730     // loop through candidates until a match was found:+1730    // перебираем кандидатов, пока не будет найдено совпадение:
 1731     foreach ($search as $img) { 1731     foreach ($search as $img) {
 1732         if (str_starts_with($img, ':')) { 1732         if (str_starts_with($img, ':')) {
Строка 1742: Строка 1744:
 1741     } 1741     }
 1742  1742 
-1743     // manage non existing target+1743    // управлять несуществующей целью
 1744     if (!file_exists($file)) { 1744     if (!file_exists($file)) {
-1745         // give result for fallback image+1745        // дать результат для резервного изображения
 1746         if ($fallback) { 1746         if ($fallback) {
 1747             $file = DOKU_INC . 'lib/images/blank.gif'; 1747             $file = DOKU_INC . 'lib/images/blank.gif';
-1748             // stop process if false result is required (if $fallback is false)+1748            // остановить процесс, если требуется ложный результат (если $fallback равен false)
 1749         } else { 1749         } else {
 1750             return false; 1750             return false;
Строка 1753: Строка 1755:
 1752     } 1752     }
 1753  1753 
-1754     // fetch image data if requested+1754    // извлечь данные изображения, если требуется
 1755     if (!is_null($imginfo)) { 1755     if (!is_null($imginfo)) {
 1756         $imginfo = getimagesize($file); 1756         $imginfo = getimagesize($file);
 1757     } 1757     }
 1758  1758 
-1759     // build URL+1759    // создать URL
 1760     if ($ismedia) { 1760     if ($ismedia) {
 1761         $url = ml($img, '', true, '', $abs); 1761         $url = ml($img, '', true, '', $abs);
Строка 1769: Строка 1771:
 1768 } 1768 }
 1769  1769 
-1770 /** +1770/** 
-1771  * PHP include a file +1771* PHP включает файл 
-1772  +1772* 
-1773  either from the conf directory if it existsotherwise use +1773* либо из каталога conf, если он существует, в противном случае используйте 
-1774  file in the template's root directory+1774* файл в корневом каталоге шаблона
-1775  +1775* 
-1776  The function honours config cascade settings and looks for the given +1776* Функция учитывает настройки каскада конфигураций и ищет заданные 
-1777  file next to the ´main´ config filesin the order protectedlocal+1777* файл рядом с «основными» файлами конфигурациив порядке защищенныйлокальный
-1778  default+1778* по умолчанию
-1779  +1779* 
-1780  Noteno escaping or sanity checking is done hereNever pass user input +1780* Примечаниездесь не выполняется экранирование или проверка на работоспособностьНикогда не передавайте пользовательский ввод 
-1781  to this function+1781* к этой функции
-1782  +1782* 
-1783  * @param string $file +1783* @param  string $ файл 
-1784  +1784* 
-1785  * @author Andreas Gohr <andi@splitbrain.org> +1785* @автор Андреас Гор <andi@splitbrain.org> 
-1786  * @author Anika Henke <anika@selfthinker.org> +1786* @автор Аника Хенке <anika@selfthinker.org> 
-1787  */+1787*/
 1788 function tpl_includeFile($file) 1788 function tpl_includeFile($file)
 1789 { 1789 {
Строка 1801: Строка 1803:
 1800     } 1800     }
 1801  1801 
-1802     // still heretry the template dir+1802    // все еще здесьпопробуйте шаблон dir
 1803     $file = tpl_incdir() . $file; 1803     $file = tpl_incdir() . $file;
 1804     if (file_exists($file)) { 1804     if (file_exists($file)) {
Строка 1808: Строка 1810:
 1807 } 1807 }
 1808  1808 
-1809 /** +1809/** 
-1810  Returns <link> tag for various icon types (favicon|mobile|generic) +1810* Возвращает тег <link> для различных типов иконок (favicon|mobile|generic) 
-1811  +1811* 
-1812  * @param array $types - list of icon types to display (favicon|mobile|generic) +1812* @param  array $ types - список типов иконок для отображения (favicon|mobile|generic) 
-1813  * @return string +1813* @возвращаемая  строка 
-1814  +1814* 
-1815  * @author Anika Henke <anika@selfthinker.org> +1815* @автор Аника Хенке <anika@selfthinker.org> 
-1816  */+1816*/
 1817 function tpl_favicon($types = ['favicon']) 1817 function tpl_favicon($types = ['favicon'])
 1818 { 1818 {
Строка 1842: Строка 1844:
 1841 } 1841 }
 1842  1842 
-1843 /** +1843/** 
-1844  Prints full-screen media manager +1844* Печать полноэкранного медиа-менеджера 
-1845  +1845* 
-1846  * @author Kate Arzamastseva <pshns@ukr.net> +1846* @author Катя Арзамасцева <pshns@ukr.net> 
-1847  */+1847*/
 1848 function tpl_media() 1848 function tpl_media()
 1849 { 1849 {
Строка 1886: Строка 1888:
 1885 } 1885 }
 1886  1886 
-1887 /** +1887/** 
-1888  Return useful layout classes +1888* Возвращаем полезные классы макета 
-1889  +1889* 
-1890  * @return string +1890* @возвращаемая  строка 
-1891  +1891* 
-1892  * @author Anika Henke <anika@selfthinker.org> +1892* @автор Аника Хенке <anika@selfthinker.org> 
-1893  */+1893*/
 1894 function tpl_classes() 1894 function tpl_classes()
 1895 { 1895 {
Строка 1910: Строка 1912:
 1909 } 1909 }
 1910  1910 
-1911 /** +1911/** 
-1912  Create event for tools menues +1912* Создать событие для меню инструментов 
-1913  +1913* 
-1914  * @param string $toolsname name of menu +1914* @param  string $ toolsname имя меню 
-1915  * @param array $items +1915* @param  массив элементы 
-1916  * @param string $view e.g. 'main', 'detail', ... +1916* @param  string $ view например 'main', 'detail', ... 
-1917  +1917* 
-1918  * @author Anika Henke <anika@selfthinker.org> +1918* @автор Аника Хенке <anika@selfthinker.org> 
-1919  * @deprecated 2017-09-01 see devel:menus +1919* @deprecated 2017-09-01 см. devel:menus 
-1920  */+1920*/
 1921 function tpl_toolsevent($toolsname, $items, $view = 'main') 1921 function tpl_toolsevent($toolsname, $items, $view = 'main')
 1922 { 1922 {
Строка 1934: Строка 1936:
 1933 1933
 </code> </code>
 +
 +<details>
 +<summary>Полный перевод для понимая</summary>
 +<code php>
 +1<?php
 +2
 +3/**
 +4* Функции шаблонов DokuWiki
 +5*
 +6* @license     GPL 2 ( http://www.gnu.org/licenses/gpl.html)
 +7* @автор      Андреас Гор <andi@splitbrain.org>
 +8*/
 +9
 +10использовать  dokuwiki \ ActionRouter ;
 +11используйте  dokuwiki \ Действие \ Исключение \ FatalException ;
 +12использовать  dokuwiki \ Extension \ PluginInterface ;
 +13используйте  dokuwiki \ Ui \ Admin ;
 +14использовать  dokuwiki \ StyleUtils ;
 +15использовать  dokuwiki \ Меню \ Элемент \ AbstractItem ;
 +16использовать  dokuwiki \ Форма \ Форма ;
 +17используйте  dokuwiki \ Menu \ MobileMenu ;
 +18используйте  dokuwiki \ Ui \ Subscribe ;
 +19используйте  dokuwiki \ Extension \ AdminPlugin ;
 +20использовать  dokuwiki \ Extension \ Event ;
 +21используйте  dokuwiki \ File \ PageResolver ;
 +22
 +23/**
 +24* Доступ к файлу шаблона
 +25*
 +26* Возвращает путь к указанному файлу внутри текущего шаблона, использует
 +27* шаблон по умолчанию, если пользовательская версия не существует.
 +28*
 +29* @param  string $ файл
 +30* @возвращаемая  строка
 +31*
 +32* @автор Андреас Гор <andi@splitbrain.org>
 +33*/
 +34 шаблон функции ($ file )
 +35{
 +36    глобальная $ conf ;
 +37
 +38    если (@ is_readable ( DOKU_INC . ' lib / tpl /' . $ conf [ 'template' ] . '/' . $ file ))
 +39        вернуть  DOKU_INC.'lib / tpl /'.$ conf [ ' template' ] . ' /' . $ file ;
 +40
 +41    вернуть  DOKU_INC.'lib / tpl / dokuwiki /'.$ file ;
 +​​​​42}
 +43
 +44/**
 +45* Удобная функция для доступа к каталогу шаблонов из локальной ФС
 +46*
 +47* Заменяет устаревшую константу DOKU_TPLINC.
 +48*
 +49* @param  string $ tpl Шаблон для использования, по умолчанию текущий
 +50* @возвращаемая  строка
 +51*
 +52* @автор Андреас Гор <andi@splitbrain.org>
 +53*/
 +54функция  tpl_incdir ($ tpl = '' )
 +55{
 +56    глобальная $ conf ;
 +57    если (!$ tpl ) $ tpl = $ conf [ 'шаблон' ];
 +58    вернуть  DOKU_INC . ' lib / tpl /' . $ tpl . '/' ;
 +59}
 +60
 +61/**
 +62* Удобная функция доступа к каталогу шаблонов из Интернета
 +63*
 +64* Заменяет устаревшую константу DOKU_TPL
 +65*
 +66* @param  string $ tpl Шаблон для использования, по умолчанию текущий
 +67* @возвращаемая  строка
 +68*
 +69* @автор Андреас Гор <andi@splitbrain.org>
 +70*/
 +71функция  tpl_basedir ($ tpl = '' )
 +72{
 +73    глобальная $ conf ;
 +74    если (!$ tpl ) $ tpl = $ conf [ 'шаблон' ];
 +75    вернуть  DOKU_BASE.'lib / tpl /'.$ tpl . ' / ' ;
 +​​76}
 +77
 +78/**
 +79* Распечатать содержимое
 +80*
 +81* Эта функция используется для печати всего обычного контента.
 +82* (определяется глобальной переменной $ACT) путем вызова соответствующего
 +83* выходные функции из html.php
 +84*
 +85* Все, что не использует основной файл шаблона, не
 +86* обрабатывается этой функцией. ACL-списки здесь тоже не обрабатываются.
 +87*
 +88* @param  bool $ prependTOC следует ли здесь отображать оглавление?
 +89* @return  bool true, если есть какой-либо вывод
 +90*
 +91* @triggers TPL_ACT_RENDER
 +92* @triggers TPL_CONTENT_DISPLAY
 +93* @автор Андреас Гор <andi@splitbrain.org>
 +94*/
 +95функция  tpl_content ($ prependTOC = true )
 +96{
 +97    глобальный $ ACT ;
 +98    глобальная $ ИНФОРМАЦИЯ ;
 +99    $ INFO [ 'prependTOC' ] = $ prependTOC ;
 +100
 +101    ob_start ();
 +102    Событие :: createAndTrigger ( 'TPL_ACT_RENDER' , $ ACT , 'tpl_content_core' );
 +103    $ html_output = ob_get_clean ();
 +104    Событие :: createAndTrigger ( 'TPL_CONTENT_DISPLAY' , $ html_output , function ($ html_output ) {
 +105        echo $ html_output ;
 +106    });
 +107
 +108    возврат ! пусто ($ html_output );
 +109}
 +110
 +111/**
 +112* Действие по умолчанию TPL_ACT_RENDER
 +113*
 +114* @return  bool
 +115*/
 +116функция  tpl_content_core ()
 +117{
 +118    $ router = ActionRouter :: getInstance ();
 +119    пытаться {
 +120        $ маршрутизатор -> getAction ()-> tplContent ();
 +121    } поймать ( FatalException $ e ) {
 +122        // не было контента для действия
 +123        сообщение ( hsc ($ e -> getMessage ()), -1 );
 +124        вернуть  ложь ;
 +125    }
 +126    вернуть  истину ;
 +127}
 +128
 +129/**
 +130* Размещает оглавление там, где вызывается функция
 +131*
 +132* Если вы используете это, вы, скорее всего, захотите вызвать tpl_content с помощью
 +133* ложный аргумент
 +134*
 +135* @param  bool $ return Следует ли вернуть оглавление вместо его печати?
 +136* @возвращаемая  строка
 +137*
 +138* @автор Андреас Гор <andi@splitbrain.org>
 +139*/
 +140функция  tpl_toc ($ return = false )
 +141{
 +142    глобальный $ TOC ;
 +143    глобальный $ ACT ;
 +144    глобальный $ ID ;
 +145    глобальный $ REV ;
 +146    глобальная $ ИНФОРМАЦИЯ ;
 +147    глобальная $ conf ;
 +148    $ toc = [];
 +149
 +150    если ( is_array ($ TOC )) {
 +151        // если TOC был подготовлен в глобальном масштабе, всегда используйте его
 +152        $ toc = $ TOC ;
 +153    } elseif (($ ACT == 'show' || str_starts_with ($ ACT , 'export' )) && !$ REV && $ INFO [ 'exists' ]) {
 +154        // получить TOC из метаданных, отобразить при необходимости
 +155        $ meta = p_get_metadata ($ ID , '' , METADATA_RENDER_USING_CACHE );
 +156        $ tocok = $ meta [ 'internal' ][ 'toc' ] ?? true ;
 +157        $ toc = $ meta [ 'description' ][ 'tableofcontents' ] ?? null ;
 +158        если (!$ tocok || ! is_array ($ toc ) || !$ conf [ 'tocminheads' ] || count ($ toc ) < $ conf [ 'tocminheads' ]) {
 +159            $ toc = [];
 +160        }
 +161    } elseif ($ ACT == 'админ' ) {
 +162        // попробуем загрузить оглавление плагина администратора
 +163        /** @var  AdminPlugin $plugin */
 +164        если ($ plugin = plugin_getRequestAdminPlugin ()) {
 +165            $ toc = $ plugin -> getTOC ();
 +166            $ TOC = $ toc ; // избежать последующей перестройки
 +167        }
 +168    }
 +169
 +170    Событие :: createAndTrigger ( 'TPL_TOC_RENDER' , $ toc , null , false );
 +171    $ html = html_TOC ($ toc );
 +172    если ($ return ) вернуть $ html ;
 +173    эхо $ html ;
 +174    возвращаться  '' ;
 +175}
 +176
 +177/**
 +178* Обработка содержимого страницы администратора
 +179*
 +180* @return  bool
 +181*
 +182* @автор Андреас Гор <andi@splitbrain.org>
 +183*/
 +184функция  tpl_admin ()
 +185{
 +186    глобальная $ ИНФОРМАЦИЯ ;
 +187    глобальный $ TOC ;
 +188    глобальный $ ВХОД ;
 +189
 +190    $ плагин = null ;
 +191    $ класс = $ ВХОД -> стр ( 'страница' );
 +192    если (! пусто ($ класс )) {
 +193        $ pluginlist = plugin_list ( 'admin' );
 +194
 +195        если ( in_array ($ class , $ pluginlist )) {
 +196            // попытка загрузить плагин
 +197            /** @var  AdminPlugin $plugin */
 +198            $ plugin = plugin_load ( 'admin' , $ class );
 +199        }
 +200    }
 +201
 +202    если ($ plugin  instanceof  PluginInterface ) {
 +203        if (! is_array ($ TOC )) $ TOC = $ plugin -> getTOC (); //если TOC еще не был запрошен
 +204        если ($ INFO [ 'prependTOC' ]) tpl_toc ();
 +205        $ плагин -> html ();
 +206    } еще {
 +207        $ админ = новый  Администратор ();
 +208        $ админ -> показать ();
 +209    }
 +210    вернуть  истину ;
 +211}
 +212
 +213/**
 +214* Распечатайте правильные HTML-мета-заголовки
 +215*
 +216* Это необходимо разместить в заголовке вашего шаблона.
 +217*
 +218* @param  bool $ alt Нужно ли добавлять каналы и ссылки альтернативного формата?
 +219* @return  bool
 +220* @вызывает  JsonException
 +221*
 +222* @автор Андреас Гор <andi@splitbrain.org>
 +223* @triggers TPL_METAHEADER_OUTPUT
 +224*/
 +225функция  tpl_metaheaders ($ alt = true )
 +226{
 +227    глобальный $ ID ;
 +228    глобальный $ REV ;
 +229    глобальная $ ИНФОРМАЦИЯ ;
 +230    глобальный $ JSINFO ;
 +231    глобальный $ ACT ;
 +232    глобальный $ ЗАПРОС ;
 +233    глобальный $ lang ;
 +234    глобальная $ conf ;
 +235    глобальная $ updateVersion ;
 +236    /** @var  Вход $INPUT */
 +237    глобальный $ ВХОД ;
 +238
 +239    // подготавливаем массив головок
 +240    $ голова = [];
 +241
 +242    // подготовить seed для js и css
 +243    $ tseed = $ updateVersion ;
 +244    $ зависит = getConfigFiles ( 'main' );
 +245    $ зависит [] = DOKU_CONF . "tpl/" . $ conf [ 'template' ] . "/style.ini" ;
 +246    foreach ($ зависит  от $ f ) $ tseed .= @ filemtime ($ f );
 +247    $ tseed = md5 ($ tseed );
 +248
 +249    // обычные вещи
 +250    $ head [ 'meta' ][] = [ 'name' => 'generator' , 'content' => 'DokuWiki' ];
 +251    если ( действиеOK ( 'поиск' )) {
 +252        $ head [ 'ссылка' ][] = [
 +253            'rel' => 'поиск' ,
 +254            'тип' => ' приложение / opensearchdescription +xml' ,
 +255            'href' => DOKU_BASE . ' lib / exe / opensearch.php ' ,
 +256            'заголовок' => $ conf [ 'заголовок' ]
 +257        ];
 +258    }
 +259
 +260    $ head [ 'link' ][] = [ 'rel' => 'start' , 'href' => DOKU_BASE ];
 +261    если ( действиеOK ( 'индекс' )) {
 +262        $ head [ 'ссылка' ][] = [
 +263            'rel' => 'содержимое' ,
 +264            'href' => wl ($ ID , 'do=index' , false , '&' ),
 +265            'title' => $ lang [ 'btn_index' ]
 +266        ];
 +267    }
 +268
 +269    если ( действиеOK ( 'манифест' )) {
 +270        $ head [ 'ссылка' ][] = [
 +271            'rel' => 'манифест' ,
 +272            'href' => DOKU_BASE . ' lib / exe / manifest.php '
 +273        ];
 +274    }
 +275
 +276    $ styleUtil = new  StyleUtils ();
 +277    $ styleIni = $ styleUtil -> cssStyleini ();
 +278    $ replacements = $ styleIni [ 'replacements' ];
 +279    если (! пусто ($ replacements [ '__theme_color__' ])) {
 +280        $ голова [ 'мета' ][] = [
 +281            'имя' => 'цвет темы' ,
 +282            'content' => $ replacements [ '__theme_color__' ]
 +283        ];
 +284    }
 +285
 +286    если ($ альт ) {
 +287        если ( действиеOK ( 'rss' )) {
 +288            $ head [ 'ссылка' ][] = [
 +289                'rel' => 'альтернативный' ,
 +290                'тип' => ' приложение / rss +xml' ,
 +291                'title' => $ lang [ 'btn_recent' ],
 +292                'href' => DOKU_BASE . ' feed.php '
 +293            ];
 +294            $ head [ 'ссылка' ][] = [
 +295                'rel' => 'альтернативный' ,
 +296                'тип' => ' приложение / rss +xml' ,
 +297                'title' => $ lang [ 'currentns' ],
 +298                'href' => DOKU_BASE . ' feed.php ?mode=list&ns=' . ( isset ($ INFO ) ? $ INFO [ 'namespace' ] : '' )
 +299            ];
 +300        }
 +301        если (($ ACT == 'показать' || $ ACT == 'поиск' ) && $ INFO [ 'записываемый' ]) {
 +302            $ head [ 'ссылка' ][] = [
 +303                'rel' => 'редактировать' ,
 +304                'title' => $ lang [ 'btn_edit' ],
 +305                'href' => wl ($ ID , 'do=edit' , false , '&' )
 +306            ];
 +307        }
 +308
 +309        если ( actionOK ( 'rss' ) && $ ACT == 'search' ) {
 +310            $ head [ 'ссылка' ][] = [
 +311                'rel' => 'альтернативный' ,
 +312                'тип' => ' приложение / rss +xml' ,
 +313                'title' => $ lang [ 'searchresult' ],
 +314                'href' => DOKU_BASE . ' feed.php ?mode=search&q=' . $ ЗАПРОС
 +315            ];
 +316        }
 +317
 +318        если ( actionOK ( 'export_xhtml' )) {
 +319            $ head [ 'ссылка' ][] = [
 +320                'rel' => 'альтернативный' ,
 +321                'тип' => ' текст / html ' ,
 +322                'title' => $ lang [ 'plainhtml' ],
 +323                'href' => экспортссылка ($ ID , 'xhtml' , '' , false , '&' )
 +324            ];
 +325        }
 +326
 +327        если ( actionOK ( 'export_raw' )) {
 +328            $ head [ 'ссылка' ][] = [
 +329                'rel' => 'альтернативный' ,
 +330                'тип' => ' текст / обычный ' ,
 +331                'title' => $ lang [ 'wikimarkup' ],
 +332                'href' => экспортссылка ($ ID , 'raw' , '' , false , '&' )
 +333            ];
 +334        }
 +335    }
 +336
 +337    // настройка тегов робота, подходящих для разных режимов
 +338    если (($ ACT == 'show' || $ ACT == 'export_xhtml' ) && !$ REV ) {
 +339        если ($ INFO [ 'существует' ]) {
 +340            //задержка индексации:
 +341            если (( время () - $ INFO [ 'lastmod' ]) >= $ conf [ 'indexdelay' ] && ! isHiddenPage ($ ID )) {
 +342                $ head [ 'meta' ][] = [ 'name' => 'robots' , 'content' => 'index,follow' ];
 +343            } еще {
 +344                $ head [ 'meta' ][] = [ 'name' => 'robots' , 'content' => 'noindex,nofollow' ];
 +345            }
 +346            $ canonicalUrl = wl ($ ID , '' , true , '&' );
 +347            если ($ ID == $ conf [ 'start' ]) {
 +348                $ canonicalUrl = DOKU_URL ;
 +349            }
 +350            $ head [ 'link' ][] = [ 'rel' => 'canonical' , 'href' => $ canonicalUrl ];
 +351        } еще {
 +352            $ head [ 'meta' ][] = [ 'name' => 'robots' , 'content' => 'noindex,follow' ];
 +353        }
 +354    } elseif ( определено ('DOKU_MEDIADETAIL')) {
 +355         $ head [ 'meta' ][] = [ 'name' => 'robots' , 'content' => 'index,follow' ];
 +356    } еще {
 +357        $ head [ 'meta' ][] = [ 'name' => 'robots' , 'content' => 'noindex,nofollow' ];
 +358    }
 +359
 +360    // установить метаданные
 +361    если ($ ACT == 'показать' || $ ACT == 'export_xhtml' ) {
 +362        // ключевые слова (явные или неявные)
 +363        если (! пусто ($ INFO [ 'meta' ][ 'subject' ])) {
 +364            $ head [ 'meta' ][] = [ 'name' => 'keywords' , 'content' => implode ( ',' , $ INFO [ 'meta' ][ 'subject' ])];
 +365        } еще {
 +366            $ head [ 'meta' ][] = [ 'name' => 'keywords' , 'content' => str_replace ( ':' , ',' , $ ID )];
 +367        }
 +368    }
 +369
 +370    // загрузка таблиц стилей
 +371    $ head [ 'ссылка' ][] = [
 +372        'rel' => 'таблица стилей' ,
 +373        'href' => DOKU_BASE . ' lib / exe / css.php ?t=' . rawurlencode ($ conf [ 'template' ]) . '&tseed=' . $ tseed
 +374    ];
 +375
 +376    $ script = "var NS=" . ( isset ($ INFO ) ? $ INFO [ 'namespace' ] : '' ) . "';" ;
 +377    если ($ conf [ 'useacl' ] && $ INPUT -> сервер -> str ( 'REMOTE_USER' )) {
 +378        $ скрипт .= "var SIG=" . тулбар_сигнатура () . ";" ;
 +379    }
 +380    jsinfo ();
 +381    $ script .= 'var JSINFO = ' . json_encode ($ JSINFO , JSON_THROW_ON_ERROR ) . ';' ;
 +382    $ script .= '(function(H){H.className=H.className.replace(/\bno-js\b/, \' js \' )})(document.documentElement);' ;
 +383    $ head [ 'script' ][] = [ '_data' => $ script ];
 +384
 +385    // загрузить jquery
 +386    $ jquery = getCdnUrls ();
 +387    foreach ($ jquery  как $ src ) {
 +388        $ head [ 'скрипт' ][] = [
 +389                '_data' => '' ,
 +390                'источник' => $ источник
 +391            ] + ($ conf [ 'defer_js' ] ? [ 'defer' => 'defer' ] : []);
 +392    }
 +393
 +394    // загружаем наш диспетчер javascript
 +395    $ head [ 'скрипт' ][] = [
 +396            '_data' => '' ,
 +397            'src' => DOKU_BASE . ' lib / exe / js.php ' . '?t=' . rawurlencode ($ conf [ 'шаблон' ]) . '&tseed=' . $ семя
 +398        ] + ($ conf [ 'defer_js' ] ? [ 'defer' => 'defer' ] : []);
 +399
 +400    // вызвать событие здесь
 +401    Событие :: createAndTrigger ( 'TPL_METAHEADER_OUTPUT' , $ head , '_tpl_metaheaders_action' , true );
 +402    вернуть  истину ;
 +403}
 +404
 +405/**
 +406* печатает массив, созданный tpl_metaheaders
 +407*
 +408* $data — это массив различных тегов заголовков. Каждый тег может иметь несколько
 +409* экземпляры. Атрибуты задаются как пары ключ-значение. Значения будут HTML
 +410* кодируются автоматически, поэтому их следует предоставлять как есть в массиве $data.
 +411*
 +412* Для тегов, имеющих атрибут body, укажите данные body в специальном поле
 +413* атрибут '_data'. Это поле НЕ БУДЕТ ЭКРАНИРОВАНО автоматически.
 +414*
 +415* Встроенные скрипты будут использовать любой одноразовый номер, указанный в переменной среды «NONCE».
 +416*
 +417* @param  массив $ данные
 +418*
 +419* @автор Андреас Гор <andi@splitbrain.org>
 +420*/
 +421функция  _tpl_metaheaders_action ($ data )
 +422{
 +423    $ nonce = getenv ( 'NONCE' );
 +424    foreach ($ data  как $ tag => $ inst ) {
 +425        foreach ($ inst  as $ attr ) {
 +426            если ( пусто ($ attr )) {
 +427                продолжать ;
 +428            }
 +429            если ($ nonce && $ tag == 'script' && ! empty ($ attr [ '_data' ])) {
 +430                $ attr [ 'nonce' ] = $ nonce ; // добавить nonce к встроенным тегам скрипта
 +431            }
 +432            echo  '<' , $ tag , ' ' , buildAttributes ($ attr );
 +433            если ( isset ($ attr [ '_data' ]) || $ tag == 'script' ) {
 +434                echo  '>' , $ attr [ '_data' ] ?? '' , '</' , $ tag , '>' ;
 +435            } еще {
 +436                эхо  '/>' ;
 +437            }
 +438            эхо  " \n " ;
 +439        }
 +440    }
 +441}
 +442
 +443/**
 +444* Вывести данный скрипт как встроенный тег скрипта
 +445*
 +446* Эта функция добавит атрибут nonce, если он доступен.
 +447*
 +448* Скрипт НЕ экранируется автоматически!
 +449*
 +450* @param  string $ скрипт
 +451* @param  bool $ return Возврат или прямая печать?
 +452* @return  string | недействительный
 +453*/
 +454функция  tpl_inlineScript ($ script , $ return = false )
 +455{
 +456    $ nonce = getenv ( 'NONCE' );
 +457    если ($ nonce ) {
 +458        $ скрипт = '<script nonce="' . $ nonce . '">' . $ скрипт . '</script>' ;
 +459    } еще {
 +460        $ скрипт = '<скрипт>' . $ скрипт . '</скрипт>' ;
 +461    }
 +462
 +463    если ($ return ) return $ script ;
 +464    эхо $ скрипт ;
 +465}
 +466
 +467/**
 +468* Распечатать ссылку
 +469*
 +470* Просто создает ссылку.
 +471*
 +472* @param  string $ url
 +473* @param  string $ имя
 +474* @param  string $ еще
 +475* @param  bool $ return если true вернуть ссылку html, в противном случае вывести
 +476* @return  bool | строка html ссылки или true, если выводится
 +477*
 +478* @автор Андреас Гор <andi@splitbrain.org>
 +479*/
 +480функция  tpl_link ($ url , $ name , $ more = '' , $ return = false )
 +481{
 +482    $ out = '<a href="' . $ url . '" ' ;
 +483    если ($ more ) $ out .= ' ' . $ more ;
 +484    $ out .= "> $ имя </a>" ;
 +485    если ($ return ) вернуть $ out ;
 +486    вывести $ ;
 +​487    вернуть  истину ;
 +488}
 +489
 +490/**
 +491* Печатает ссылку на WikiPage
 +492*
 +493* Обертка вокруг html_wikilink
 +494*
 +495* @param  string $ id идентификатор страницы
 +496* @param  string | null $ name имя ссылки
 +497* @param  bool $ возврат
 +498* @return  true | строка
 +499*
 +500* @автор Андреас Гор <andi@splitbrain.org>
 +501*/
 +502функция  tpl_pagelink ($ id , $ name = null , $ return = false )
 +503{
 +504    $ out = '<bdi>' . html_wikilink ( $ id , $ name ) . '</bdi>' ;
 +505    если ($ return ) вернуть $ out ;
 +506    вывести $ ;
 +​507    вернуть  истину ;
 +508}
 +509
 +510/**
 +511* получить родительскую страницу
 +512*
 +513* Пытается выяснить, какая страница является родительской.
 +514* возвращает false, если ничего не доступно
 +515*
 +516* @param  string $ id идентификатор страницы
 +517* @return  false | строка
 +518*
 +519* @автор Андреас Гор <andi@splitbrain.org>
 +520*/
 +521функция  tpl_getparent ($ id )
 +522{
 +523    $ resolver = new  PageResolver ( 'root' );
 +524
 +525    $ parent = getNS ($ id ). ':' ;
 +526    $ parent = $ resolver -> resolveId ($ parent );
 +527    если ($ родитель == $ идентификатор ) {
 +528        $ pos = strrpos ( getNS ($ id ), ':' );
 +529        $ parent = substr ($ parent , 0 , $ pos ). ':' ;
 +530        $ parent = $ resolver -> resolveId ($ parent );
 +531        если ($ parent == $ id ) вернуть  false ;
 +532    }
 +533    вернуть $ родитель ;
 +534}
 +535
 +536/**
 +537* Распечатать одну из кнопок
 +538*
 +539* @param  string $ тип
 +540* @param  bool $ возврат
 +541* @return  bool | string html, или false, если данных нет, true, если выведено
 +542* @see     tpl_get_action
 +543*
 +544* @автор Адриан Лэнг <mail@adrianlang.de>
 +545* @deprecated 2017-09-01 см. devel:menus
 +546*/
 +547функция  tpl_button ($ тип , $ возврат = ложь )
 +548{
 +549    dbg_deprecated ( 'см. devel:menus' );
 +550    $ data = tpl_get_action ($ type );
 +551    если ($ данные === ложь ) {
 +552        вернуть  ложь ;
 +553    } elseif (! is_array ($ data )) {
 +554        $ out = sprintf ($ data , 'button' );
 +555    } еще {
 +556        /**
 +557         * @var  string $accesskey
 +558         * @var  string $id
 +559         * @var  string $метод
 +560         * @var  массив $params
 +561         */
 +562        извлечь ($ data );
 +563        если ($ id === '#dokuwiki__top' ) {
 +564            $ out = html_topbtn ();
 +565        } еще {
 +566            $ out = html_btn ($ type , $ id , $ accesskey , $ params , $ method );
 +567        }
 +568    }
 +569    если ($ return ) вернуть $ out ;
 +570    вывести $ ;
 +​571    вернуть  истину ;
 +572}
 +573
 +574/**
 +575* Как кнопки действий, но ссылки
 +576*
 +577* @param  string $ тип действие команда
 +578* @param  string $ pre префикс ссылки
 +579* @param  string $ suf суффикс ссылки
 +580* @param  string $ внутренний innerHML ссылки
 +581* @param  bool $ return если true, то возвращает html, в противном случае печатает
 +582* @return  bool | string html или false, если данных нет, true, если выведено
 +583*
 +584* @see     tpl_get_action
 +585* @автор Адриан Лэнг <mail@adrianlang.de>
 +586* @deprecated 2017-09-01 см. devel:menus
 +587*/
 +588функция  tpl_actionlink ($ type , $ pre = '' , $ suf = '' , $ inner = '' , $ return = false )
 +589{
 +590    dbg_deprecated ( 'см. devel:menus' );
 +591    глобальный $ lang ;
 +592    $ data = tpl_get_action ($ type );
 +593    если ($ данные === ложь ) {
 +594        вернуть  ложь ;
 +595    } elseif (! is_array ($ data )) {
 +596        $ out = sprintf ($ data , 'link' );
 +597    } еще {
 +598        /**
 +599         * @var  string $accesskey
 +600         * @var  string $id
 +601         * @var  string $метод
 +602         * @var  bool $nofollow
 +603         * @var  массив $params
 +604         * @var  string $replacement
 +605         */
 +606        извлечь ($ data );
 +607        если ( strpos ($ id , '#' ) === 0 ) {
 +608            $ linktarget = $ id ;
 +609        } еще {
 +610            $ linktarget = wl ($ id , $ params );
 +611        }
 +612        $ caption = $ lang [ 'btn_' . $ type ];
 +613        если ( strpos ($ caption , '%s' )) {
 +614            $ caption = sprintf ($ caption , $ replacement );
 +615        }
 +616        $ akey = '' ;
 +617        $ addTitle = '' ;
 +618        если ($ accesskey ) {
 +619            $ akey = 'accesskey="' . $ accesskey . '" ' ;
 +620            $ addTitle = '[' . strtoupper ($ accesskey ) . ']' ;
 +621        }
 +622        $ rel = $ nofollow ? 'rel="nofollow" ' : '' ;
 +623        $ out = tpl_link (
 +624            $ ссылкацель ,
 +625            $ pre . ($ inner ?: $ caption ) . $ suf ,
 +626            'класс="действие' . $ тип . '" ' .
 +627            $ akey . $ rel .
 +628            'title="' . hsc ($ caption ) . $ addTitle . '"' ,
 +629            истинный
 +630        );
 +631    }
 +632    если ($ return ) вернуть $ out ;
 +633    вывести $ ;
 +​634    вернуть  истину ;
 +635}
 +636
 +637/**
 +638* Проверьте действия и получите данные для кнопок и ссылок
 +639*
 +640* @param  string $ тип
 +641* @return  массив | bool | строка
 +642*
 +643* @автор Адриан Лэнг <mail@adrianlang.de>
 +644* @автор Андреас Гор <andi@splitbrain.org>
 +645* @автор Маттиас Гримм <matthiasgrimm@users.sourceforge.net>
 +646* @deprecated 2017-09-01 см. devel:menus
 +647*/
 +648функция  tpl_get_action ($ тип )
 +649{
 +650    dbg_deprecated ( 'см. devel:menus' );
 +651    если ($ type == 'history' ) $ type = 'revisions' ;
 +652    если ($ type == 'подписка' ) $ type = 'подписка' ;
 +653    если ($ type == 'img_backto' ) $ type = 'imgBackto' ;
 +654
 +655    $ class = ' \\ dokuwiki \\ Меню \\ Элемент \\ ' . ucfirst ($ type );
 +656    если ( class_exists ($ class )) {
 +657        пытаться {
 +658            /** @var  AbstractItem $item */
 +659            $ item = новый $ class ();
 +660            $ data = $ item -> getLegacyData ();
 +661            $ неизвестно = ложь ;
 +662        } catch ( RuntimeException $ игнорируется ) {
 +663            вернуть  ложь ;
 +664        }
 +665    } еще {
 +666        глобальный $ ID ;
 +667        $ данные = [
 +668            'accesskey' => null ,
 +669            'тип' => $ тип ,
 +670            'id' => $ ID ,
 +671            'метод' => 'получить' ,
 +672            'params' => [ 'do' => $ type ],
 +673            'nofollow' => правда ,
 +674            'замена' => ''
 +675        ];
 +676        $ неизвестно = правда ;
 +677    }
 +678
 +679    $ evt = новое  событие ( 'TPL_ACTION_GET' , $ data );
 +680    если ($ evt -> advice_before ()) {
 +681        //обработка неизвестных типов
 +682        если ($ неизвестно ) {
 +683            $ data = '[неизвестный тип %s]' ;
 +684        }
 +685    }
 +686    $ evt -> advice_after ();
 +687    снято ($ evt );
 +688
 +689    вернуть $ данные ;
 +690}
 +691
 +692/**
 +693* Обертка вокруг tpl_button() и tpl_actionlink()
 +694*
 +695* @param  string $ тип действие команда
 +696* @param  bool $ ссылка ссылка или кнопка формы?
 +697* @param  string | bool $ wrapper Обертка HTML-элемента
 +698* @param  bool $ return return или print
 +699* @param  string $ pre префикс для ссылок
 +700* @param  string $ suf суффикс для ссылок
 +701* @param  string $ внутренний внутренний HTML для ссылок
 +702* @return  bool | строка
 +703*
 +704* @автор Аника Хенке <anika@selfthinker.org>
 +705* @deprecated 2017-09-01 см. devel:menus
 +706*/
 +707функция  tpl_action ($ type , $ link = false , $ wrapper = false , $ return = false , $ pre = '' , $ suf = '' , $ inner = '' )
 +708{
 +709    dbg_deprecated ( 'см. devel:menus' );
 +710    $ out = '' ;
 +711    если ($ ссылка ) {
 +712        $ out .= tpl_actionlink ($ type , $ pre , $ suf , $ inner , true );
 +713    } еще {
 +714        $ out .= tpl_button ( $ type , true );
 +715    }
 +716    если ($ out && $ wrapper ) $ out = "< $ wrapper > $ out </ $ wrapper >" ;
 +717
 +718    если ($ return ) вернуть $ out ;
 +719    вывести $ ;
 +​720    return ( bool )$ out ;
 +721}
 +722
 +723/**
 +724* Распечатать форму поиска
 +725*
 +726* Если первый параметр задан как div с идентификатором 'qsearch_out', то будет
 +727* добавляется, который инструктирует страницу ajax quicksearch включиться и разместить
 +728* его вывод в этот div. Второй параметр управляет собственным
 +729* атрибут автозаполнения. Если установлено значение false, этот атрибут будет установлен с
 +730* значение "off" указывает браузеру отключить встроенные функции
 +731* функция автодополнения (MSIE и Firefox)
 +732*
 +733* @param  bool $ ajax
 +734* @param  bool $ автозаполнение
 +735* @return  bool
 +736*
 +737* @автор Андреас Гор <andi@splitbrain.org>
 +738*/
 +739функция  tpl_searchform ($ ajax = true , $ autocomplete = true )
 +740{
 +741    глобальный $ lang ;
 +742    глобальный $ ACT ;
 +743    глобальный $ ЗАПРОС ;
 +744    глобальный $ ID ;
 +745
 +746    // не печатать форму поиска, если действие поиска отключено
 +747    если (! actionOK ( 'search' )) вернуть  false ;
 +748
 +749    $ searchForm = новая  форма ([
 +750        'действие' => wl (),
 +751        'метод' => 'получить' ,
 +752        'роль' => 'поиск' ,
 +753        'класс' => 'поиск' ,
 +754        'id' => 'dw__search' ,
 +755    ], истинный );
 +756    $ searchForm -> addTagOpen ( 'div' )-> addClass ( 'no' );
 +757    $ searchForm -> setHiddenField ( 'сделать' , 'поиск' );
 +758    $ searchForm -> setHiddenField ( 'id' , $ ID );
 +759    $ searchForm -> addTextInput ( 'q' )
 +760        -> добавитьКласс ( 'редактировать' )
 +761        -> атрибуты ([
 +762            'заголовок' => '[F]' ,
 +763            'accesskey' => 'f' ,
 +764            'placeholder' => $ lang [ 'btn_search' ],
 +765            'autocomplete' => $ autocomplete ? 'on' : 'off' ,
 +766        ])
 +767        -> идентификатор ( 'qsearch__in' )
 +768        -> val ($ ACT === 'поиск' ? $ QUERY : '' )
 +769        -> useInput ( false );
 +770    $ searchForm -> addButton ( '' , $ lang [ 'btn_search' ])-> attrs ([
 +771        'тип' => 'отправить' ,
 +772        'title' => $ lang [ 'btn_search' ],
 +773    ]);
 +774    если ($ ajax ) {
 +775        $ searchForm -> addTagOpen ( 'div' )-> id ( 'qsearch__out' )-> addClass ( 'ajax_qsearch JSpopup' );
 +776        $ searchForm -> addTagClose ( 'div' );
 +777    }
 +778    $ searchForm -> addTagClose ( 'div' );
 +779
 +780    echo $ searchForm -> toHTML ( 'Быстрый поиск' );
 +781
 +782    вернуть  истину ;
 +783}
 +784
 +785/**
 +786* Распечатать след навигационной цепочки
 +787*
 +788* @param  string $ sep Разделитель между записями
 +789* @param  bool $ return return или print
 +790* @return  bool | строка
 +791*
 +792* @автор Андреас Гор <andi@splitbrain.org>
 +793*/
 +794функция  tpl_breadcrumbs ($ sep = null , $ return = false )
 +795{
 +796    глобальный $ lang ;
 +797    глобальная $ conf ;
 +798
 +799    //проверить, включено ли
 +800    если (!$ conf [ 'хлебные крошки' ]) вернуть  false ;
 +801
 +802    //установить значение по умолчанию
 +803    если ( is_null ($ sep )) $ sep = '•' ;
 +804
 +805    $ out = '' ;
 +806
 +807    $ crumbs = breadcrumbs (); //настройка трассировки крошек
 +808
 +809    $ crumbs_sep = ' <span class="bcsep">' . $ sep . '</span> ' ;
 +810
 +811    //рендерим крошки, выделяем последнюю
 +812    $ out .= '<span class="bchead">' . $ lang [ 'хлебные крошки' ] . '</span>' ;
 +813    $ last = count ($ crubs );
 +814    $ я = 0 ;
 +815    foreach ($ крошки  как $ id => $ name ) {
 +816        $ я ++;
 +817        $ out .= $ crumbs_sep ;
 +818        если ($ i == $ last ) $ out .= '<span class="curid">' ;
 +819        $ out .= '<bdi>' . tpl_link ( wl ( $ id ), hsc ( $ name ), ' class="breadcrumbs" title="' . $ id . '"' , true ) . '</bdi>' ;
 +820        если ($ i == $ last ) $ out .= '</span>' ;
 +821    }
 +822    если ($ return ) вернуть $ out ;
 +823    вывести $ ;
 +​824    return ( bool )$ out ;
 +825}
 +826
 +827/**
 +828* Иерархическая навигационная цепочка
 +829*
 +830* Этот код был предложен в качестве замены обычным хлебным крошкам.
 +831* Имеет смысл только при наличии глубокой структуры сайта.
 +832*
 +833* @param  string $ sep Разделитель между записями
 +834* @param  bool $ return return или print
 +835* @return  bool | строка
 +836*
 +837* @todo    может вести себя странно в языках с письмом справа налево
 +838* @автор <fredrik@averpil.com>
 +839* @автор Андреас Гор <andi@splitbrain.org>
 +840* @автор Найджел Макни <oracle.shinoda@gmail.com>
 +841* @автор Шон Коутс <sean@caedmon.net>
 +842*/
 +843функция  tpl_youarehere ($ sep = null , $ return = false )
 +844{
 +845    глобальная $ conf ;
 +846    глобальный $ ID ;
 +847    глобальный $ lang ;
 +848
 +849    // проверить, включено ли
 +850    если (!$ conf [ 'youarehere' ]) вернуть  false ;
 +851
 +852    //установить значение по умолчанию
 +853    если ( is_null ($ sep )) $ sep = ' » ' ;
 +854
 +855    $ out = '' ;
 +856
 +857    $ parts = Explode ( ':' , $ ID );
 +858    $ count = count ($ parts );
 +859
 +860    $ out .= '<span class="bchead">' . $ lang [ 'выздесь' ] . ' </span>' ;
 +861
 +862    // всегда печатать стартовую страницу
 +863    $ out .= '<span class="home">' . tpl_pagelink ( ':' . $ conf [ 'start' ], null , true ) . '</span>' ;
 +864
 +865    // распечатать промежуточные ссылки пространства имен
 +866    $ часть = '' ;
 +867    для ($ i = 0 ; $ i < $ count - 1 ; $ i ++) {
 +868        $ часть .= $ часть [$ i ]. ':' ;
 +869        $ страница = $ часть ;
 +870        if ($ page == $ conf [ 'start' ]) continue ; // Пропустить начальную страницу
 +871
 +872        // выход
 +873        $ out .= $ sep . tpl_pagelink ( $ page , null , true );
 +874    }
 +875
 +876    // распечатать текущую страницу, пропустив начальную страницу, пропустив индекс пространства имен
 +877    если ( isset ($ страница )) {
 +878        $ page = ( new  PageResolver ( 'root' ))-> resolveId ( $ page );
 +879        если ($ страница == $ часть . $ части [$ я ]) {
 +880            если ($ return ) вернуть $ out ;
 +881            вывести $ ;
 +​882            вернуть  истину ;
 +883        }
 +884    }
 +885    $ страница = $ часть . $ части [$ i ];
 +886    если ($ страница == $ конф [ 'старт' ]) {
 +887        если ($ return ) вернуть $ out ;
 +888        вывести $ ;
 +​889        вернуть  истину ;
 +890    }
 +891    $ out .= $ sep ;
 +892    $ out .= tpl_pagelink ($ page , null , true );
 +893    если ($ return ) вернуть $ out ;
 +894    вывести $ ;
 +​895    return ( bool )$ out ;
 +896}
 +897
 +898/**
 +899* Распечатать информацию, если пользователь вошел в систему
 +900* и в этом случае показывать полное имя
 +901*
 +902* Можно ли в будущем добавить ссылку на профиль?
 +903*
 +904* @return  bool
 +905*
 +906* @автор Андреас Гор <andi@splitbrain.org>
 +907*/
 +908функция  tpl_userinfo ()
 +909{
 +910    глобальный $ lang ;
 +911    /** @var  Вход $INPUT */
 +912    глобальный $ ВХОД ;
 +913
 +914    если ($ INPUT -> сервер -> str ( 'REMOTE_USER' )) {
 +915        echo $ lang [ 'loggedinas' ] . ' ' . userlink ();
 +916        вернуть  истину ;
 +917    }
 +918    вернуть  ложь ;
 +919}
 +920
 +921/**
 +922* Распечатать некоторую информацию о текущей странице
 +923*
 +924* @param  bool $ ret возвращает содержимое вместо его печати
 +925* @return  bool | строка
 +926*
 +927* @автор Андреас Гор <andi@splitbrain.org>
 +928*/
 +929функция  tpl_pageinfo ($ ret = false )
 +930{
 +931    глобальная $ conf ;
 +932    глобальный $ lang ;
 +933    глобальная $ ИНФОРМАЦИЯ ;
 +934    глобальный $ ID ;
 +935
 +936    // возвращаем, если нам не разрешено просматривать страницу
 +937    если (! auth_quickaclcheck ($ ID )) {
 +938        вернуть  ложь ;
 +939    }
 +940
 +941    // подготовить дату и путь
 +942    $ fn = $ INFO [ 'путь_к_файлу' ];
 +943    если (!$ conf [ 'полный_путь' ]) {
 +944        если ($ ИНФОРМАЦИЯ [ 'рев' ]) {
 +945            $ fn = str_replace ($ conf [ 'olddir' ] . '/' , '' , $ fn );
 +946        } еще {
 +947            $ fn = str_replace ($ conf [ 'datadir' ] . '/' , '' , $ fn );
 +948        }
 +949    }
 +950    $ fn = utf8_decodeFN ($ fn );
 +951    $ date = dformat ($ INFO [ 'lastmod' ]);
 +952
 +953    // распечатать это
 +954    если ($ INFO [ 'существует' ]) {
 +955        $ out = '<bdi>' . $ fn . '</bdi>' ;
 +956        $ out .= ' · ' ;
 +957        $ out .= $ lang [ 'lastmod' ];
 +958        $ out .= ' ' ;
 +959        $ out .= $ date ;
 +960        если ($ INFO [ 'редактор' ]) {
 +961            $ out .= ' ' . $ lang [ 'by' ] . ' ' ;
 +962            $ out .= '<bdi>' . editorinfo ($ INFO [ 'editor' ]) . '</bdi>' ;
 +963        } еще {
 +964            $ out .= ' (' . $ lang [ 'external_edit' ] . ')' ;
 +965        }
 +966        если ($ INFO [ 'заблокировано' ]) {
 +967            $ out .= ' · ' ;
 +968            $ out .= $ lang [ 'lockedby' ];
 +969            $ out .= ' ' ;
 +970            $ out .= '<bdi>' . editorinfo ($ INFO [ 'locked' ]) . '</bdi>' ;
 +971        }
 +972        если ($ рет ) {
 +973            возврат $ из ;
 +974        } еще {
 +975            вывести $ ;
 +​976            вернуть  истину ;
 +977        }
 +978    }
 +979    вернуть  ложь ;
 +980}
 +981
 +982/**
 +983* Печатает или возвращает имя указанной страницы (текущей, если не указано).
 +984*
 +985* Если включено использование заголовка, будет использоваться первый заголовок, в противном случае
 +986* используется указанный идентификатор.
 +987*
 +988* @param  string $ id идентификатор страницы
 +989* @param  bool $ ret возвращает содержимое вместо печати
 +990* @return  bool | строка
 +991*
 +992* @автор Андреас Гор <andi@splitbrain.org>
 +993*/
 +994функция  tpl_pagetitle ($ id = null , $ ret = false )
 +995{
 +996    глобальные $ ACT , $ conf , $ lang ;
 +997
 +998    если ( is_null ($ id )) {
 +999        глобальный $ ID ;
 +1000        $ id = $ ID ;
 +1001    }
 +1002
 +1003    $ имя = $ идентификатор ;
 +1004    если ( useHeading ( 'навигация' )) {
 +1005        $ first_heading = p_get_first_heading ($ id );
 +1006        если ($ first_heading ) $ name = $ first_heading ;
 +1007    }
 +1008
 +1009    // заголовок страницы по умолчанию — это имя страницы, измените его с помощью текущего действия
 +1010    переключатель ($ ACT ) {
 +1011        // административные функции
 +1012        случай  «администратор» :
 +1013            $ page_title = $ lang [ 'btn_admin' ];
 +1014            // попробуем получить имя плагина
 +1015            /** @var  AdminPlugin $plugin */
 +1016            если ($ plugin = plugin_getRequestAdminPlugin ()) {
 +1017                $ plugin_title = $ plugin -> getMenuText ($ conf [ 'lang' ]);
 +1018                $ page_title = $ plugin_title ?: $ plugin -> getPluginName ();
 +1019            }
 +1020            перерыв ;
 +1021
 +1022        // показать действие как заголовок
 +1023        случай  «логин» :
 +1024        кейс  «профиль» :
 +1025        случай  «регистр» :
 +1026        случай  'resendpwd' :
 +1027        случай  «индекс» :
 +1028        случай  «поиск» :
 +1029            $ page_title = $ lang [ 'btn_' . $ ACT ];
 +1030            перерыв ;
 +1031
 +1032        // добавить ручку во время редактирования
 +1033        случай  «редактирование» :
 +1034        случай  «предварительный просмотр» :
 +1035            $ page_title = "✎ " . $ name ;
 +1036            перерыв ;
 +1037
 +1038        // добавить действие к названию страницы
 +1039        дело  «пересмотры» :
 +1040            $ page_title = $ name . ' - ' . $ lang [ 'btn_revs' ];
 +1041            перерыв ;
 +1042
 +1043        // добавить действие к названию страницы
 +1044        случай  «обратная ссылка» :
 +1045        случай  «недавний» :
 +1046        случай  «подписаться» :
 +1047            $ page_title = $ name .'- ' .$ lang [ 'btn_' .$ ACT ];
 +1048            перерыв ;
 +1049
 +1050        по умолчанию : // SHOW и все остальное, что не включено
 +1051            $ page_title = $ name ;
 +1052    }
 +1053
 +1054    если ($ рет ) {
 +1055        вернуть  hsc ($ page_title );
 +1056    } еще {
 +1057        echo  hsc ($ page_title );
 +1058        вернуть  истину ;
 +1059    }
 +1060}
 +1061
 +1062/**
 +1063* Возвращает запрошенный тег EXIF / IPTC из текущего изображения
 +1064*
 +1065* Если $tags — это массив, то все заданные теги проверяются до тех пор, пока не будет найден
 +1066* значение найдено. Если значение не найдено, возвращается $alt.
 +1067*
 +1068* Какие тексты известны, определяется в функциях _exifTagNames
 +1069* и _iptcTagNames() в inc / jpeg.php (Вам необходимо добавить IPTC
 +1070* к именам последнего)
 +1071*
 +1072* Разрешено только в: detail.php
 +1073*
 +1074* @param  array | string $ tags тег или массив тегов для проверки
 +1075* @param  string $ alt альтернативный вывод, если данные не найдены
 +1076* @param  null | string $ src источник изображения, если не указан, используется глобальный $SRC
 +1077* @возвращаемая  строка
 +1078*
 +1079* @автор Андреас Гор <andi@splitbrain.org>
 +1080*/
 +1081функция  tpl_img_getTag ($ tags , $ alt = '' , $ src = null )
 +1082{
 +1083    // Инициализация Exif-ридера
 +1084    глобальный $ SRC , $ imgMeta ;
 +1085
 +1086    если ( is_null ($ src )) $ src = $ SRC ;
 +1087    если ( is_null ($ src )) вернуть $ alt ;
 +1088
 +1089    если (! isset ($ imgMeta )) {
 +1090        $ imgMeta = new  JpegMeta ($ src );
 +1091    }
 +1092    если ($ imgMeta === false ) вернуть $ alt ;
 +1093    $ info = cleanText ($ imgMeta -> getField ($ tags ));
 +1094    если (!$ info ) вернуть $ alt ;
 +1095    вернуть $ информацию ;
 +1096}
 +1097
 +1098
 +1099/**
 +1100* Мусор собирает открытый объект JpegMeta.
 +1101*/
 +1102функция  tpl_img_close ()
 +1103{
 +1104    глобальный $ imgMeta ;
 +1105    $ imgMeta = null ;
 +1106}
 +1107
 +1108/**
 +1109* Выводит HTML-список описаний метатегов текущего изображения
 +1110*/
 +1111функция  tpl_img_meta ()
 +1112{
 +1113    глобальный $ lang ;
 +1114
 +1115    $ теги = tpl_get_img_meta ();
 +1116
 +1117    эхо  '<dl>' ;
 +1118    foreach ($ теги  как $ теги ) {
 +1119        $ label = $ lang [$ tag [ 'langkey' ]];
 +1120        если (!$ label ) $ label = $ tag [ 'langkey' ]. ':' ;
 +1121
 +1122        echo  '<dt>' . $ label . '</dt><dd>' ;
 +1123        если ($ тег [ 'тип' ] == 'дата' ) {
 +1124            echo  dformat ($ тег [ 'значение' ]);
 +1125        } еще {
 +1126            echo  hsc ($ тег [ 'значение' ]);
 +1127        }
 +1128        эхо  '</dd>' ;
 +1129    }
 +1130    эхо  '</dl>' ;
 +1131}
 +1132
 +1133/**
 +1134* Возвращает метаданные, настроенные в файле конфигурации mediameta, готовые для создания html
 +1135*
 +1136* @return  массив с массивами, содержащими записи:
 +1137* - строка langkey key для поиска в переменной $lang, если не найдена, выводится как есть
 +1138* - строковый тип значения
 +1139* - строковое значение тега (неэкранированное)
 +1140*/
 +1141функция  tpl_get_img_meta ()
 +1142{
 +1143
 +1144    $ config_files = getConfigFiles ( 'mediameta' );
 +1145    foreach ($ config_files  как $ config_file ) {
 +1146        если ( file_exists ($ config_file )) {
 +1147            включить ($ config_file );
 +1148        }
 +1149    }
 +1150    $ теги = [];
 +1151    foreach ($ поля  как $ тег ) {
 +1152        $ т = [];
 +1153        если (! пусто ($ тег [ 0 ])) {
 +1154            $ т = [$ тег [ 0 ]];
 +1155        }
 +1156        если ( isset ($ тег [ 3 ]) && is_array ($ тег [ 3 ])) {
 +1157            $ t = array_merge ($ t , $ tag [ 3 ]);
 +1158        }
 +1159        $ value = tpl_img_getTag ($ t );
 +1160        если ($ значение ) {
 +1161            $ теги [] = [ 'langkey' => $ тег [ 1 ], 'type' => $ тег [ 2 ], 'value' => $ значение ];
 +1162        }
 +1163    }
 +1164    вернуть $ теги ;
 +1165}
 +1166
 +1167/**
 +1168* Печатает изображение со ссылкой на полноразмерную версию
 +1169*
 +1170* Разрешено только в: detail.php
 +1171*
 +1172* @triggers TPL_IMG_DISPLAY
 +1173* @param  int $ maxwidth - максимальная ширина изображения
 +1174* @param  int $ maxheight - максимальная высота изображения
 +1175* @param  bool $ link - ссылка на исходный размер?
 +1176* @param  array $ params - дополнительные атрибуты изображения
 +1177* @return  bool Результат TPL_IMG_DISPLAY
 +1178*/
 +1179функция  tpl_img ($ maxwidth = 0 , $ maxheight = 0 , $ link = true , $ params = null )
 +1180{
 +1181    глобальный $ IMG ;
 +1182    /** @var  Вход $INPUT */
 +1183    глобальный $ ВХОД ;
 +1184    глобальный $ REV ;
 +1185    $ w = ( int ) tpl_img_getTag ( 'Файл.Ширина' );
 +1186    $ h = ( int ) tpl_img_getTag ( 'Файл.Высота' );
 +1187
 +1188    //изменить размер до указанных максимальных значений
 +1189Коэффициент     $ = 1 ;
 +1190    если ($ w >= $ h ) {
 +1191        если ($ максширина && $ w >= $ максширина ) {
 +1192            $ отношение = $ максимальнаяширина / $ w ;
 +1193        } elseif ($ maxheight && $ h > $ maxheight ) {
 +1194            $ отношение = $ максимальная высота / $ h ;
 +1195        }
 +1196    } elseif ($ maxheight && $ h >= $ maxheight ) {
 +1197        $ отношение = $ максимальная высота / $ h ;
 +1198    } elseif ($ maxwidth && $ w > $ maxwidth ) {
 +1199        $ отношение = $ максимальнаяширина / $ w ;
 +1200    }
 +1201    если ($ отношение ) {
 +1202        $ w = пол ($ отношение * $ w );
 +1203        $ h = пол ( соотношение $ * $ h );
 +1204    }
 +1205
 +1206    //подготовить URL-адреса
 +1207    $ url = ml ($ IMG , [ 'cache' => $ INPUT -> str ( 'cache' ), 'rev' => $ REV ], true , '&' );
 +1208    $ src = ml ($ IMG , [ 'cache' => $ INPUT -> str ( 'cache' ), 'rev' => $ REV , 'w' => $ w , 'h' => $ h ], true , '&' );
 +1209
 +1210    //подготовить атрибуты
 +1211    $ alt = tpl_img_getTag ( 'Простой.Заголовок' );
 +1212    если ( is_null ($ params )) {
 +1213        $ р = [];
 +1214    } еще {
 +1215        $ p = $ параметры ;
 +1216    }
 +1217    если ($ w ) $ p [ 'ширина' ] = $ w ;
 +1218    если ($ h ) $ p [ 'высота' ] = $ h ;
 +1219    $ p [ 'class' ] = 'img_detail' ;
 +1220    если ($ альт ) {
 +1221        $ p [ 'alt' ] = $ alt ;
 +1222        $ p [ 'title' ] = $ alt ;
 +1223    } еще {
 +1224        $ p [ 'alt' ] = '' ;
 +1225    }
 +1226    $ p [ 'источник' ] = $ источник ;
 +1227
 +1228    $ data = [ 'url' => ($ link ? $ url : null ), 'params' => $ p ];
 +1229    return  Event :: createAndTrigger ( 'TPL_IMG_DISPLAY' , $ data , '_tpl_img_action' , true );
 +1230}
 +1231
 +1232/**
 +1233* Действие по умолчанию для TPL_IMG_DISPLAY
 +1234*
 +1235* @param  массив $ данные
 +1236* @return  bool
 +1237*/
 +1238функция  _tpl_img_action ($ data )
 +1239{
 +1240    глобальный $ lang ;
 +1241    $ p = buildAttributes ($ data [ 'params' ]);
 +1242
 +1243    если ($ data [ 'url' ]) echo  ' <a href="' . hsc ($ data [ 'url' ]) . '" title="' . $ lang [ 'mediaview' ] . '"> ' ;
 +1244    echo  '<img ' . $ p . '/>' ;
 +1245    если ($ data [ 'url' ]) echo  '</a>' ;
 +1246    вернуть  истину ;
 +1247}
 +1248
 +1249/**
 +1250* Эта функция вставляет небольшой gif-файл, который на самом деле является функцией индексатора.
 +1251*
 +1252* Должен вызываться где-то в самом конце шаблона main.php
 +1253*
 +1254* @return  bool
 +1255*/
 +1256функция  tpl_indexerWebBug ()
 +1257{
 +1258    глобальный $ ID ;
 +1259
 +1260    $ р = [];
 +1261    $ p [ 'src' ] = DOKU_BASE . ' lib / exe / taskrunner.php ?id=' . rawurlencode ($ ID ) .
 +1262        '&' . время ();
 +1263    $ p [ 'width' ] = 2 ; //больше никаких изображений размером 1x1 пиксель, потому что мы живем во времена блокировщиков рекламы...
 +1264    $ p [ 'высота' ] = 1 ;
 +1265    $ p [ 'alt' ] = '' ;
 +1266    $ att = buildAttributes ($ p );
 +1267    echo  "<img $ att />" ;
 +1268    вернуть  истину ;
 +1269}
 +1270
 +1271/**
 +1272* tpl_getConf($id)
 +1273*
 +1274* используйте эту функцию для доступа к переменным конфигурации шаблона
 +1275*
 +1276* @param  string $ id имя значения для доступа
 +1277* @param  mixed $ notset что возвращать, если настройка недоступна
 +1278* @return  смешанный
 +1279*/
 +1280функция  tpl_getConf ($ id , $ notset = false )
 +1281{
 +1282    глобальная $ conf ;
 +1283    статический $ tpl_configloaded = false ;
 +1284
 +1285    $ tpl = $ conf [ 'шаблон' ];
 +1286
 +1287    если (!$ tpl_configloaded ) {
 +1288        $ tconf = tpl_loadConfig ();
 +1289        если ($ tconf !== false ) {
 +1290            foreach ($ tconf  as $ key => $ value ) {
 +1291                если ( isset ($ conf [ 'tpl' ][$ tpl ][$ key ])) продолжить ;
 +1292                $ conf [ 'tpl' ][$ tpl ][$ key ] = $ value ;
 +1293            }
 +1294            $ tpl_configloaded = true ;
 +1295        }
 +1296    }
 +1297
 +1298    вернуть $ conf [ 'tpl' ][$ tpl ][$ id ] ?? $ notset ;
 +1299}
 +1300
 +1301/**
 +1302* tpl_loadConfig()
 +1303*
 +1304* считывает все переменные конфигурации шаблона
 +1305* эта функция автоматически вызывается tpl_getConf()
 +1306*
 +1307* @return  false | массив
 +1308*/
 +1309функция  tpl_loadConfig ()
 +1310{
 +1311
 +1312    $ file = tpl_incdir (
 + ) . ' /conf/default.php ' ;1313    $ conf = [];
 +1314
 +1315    если (! file_exists ($ file )) вернуть  false ;
 +1316
 +1317    // загрузить файл конфигурации по умолчанию
 +1318    включить ($ файл );
 +1319
 +1320    вернуть $ conf ;
 +1321}
 +1322
 +1323// методы языка
 +1324
 +1325/**
 +1326* tpl_getLang($id)
 +1327*
 +1328* используйте эту функцию для доступа к переменным языка шаблона
 +1329*
 +1330* @param  string $ id ключ языковой строки
 +1331* @возвращаемая  строка
 +1332*/
 +1333функция  tpl_getLang ($ id )
 +1334{
 +1335    статический $ lang = [];
 +1336
 +1337    если ( количество ($ язык ) === 0 ) {
 +1338        global $ conf , $ config_cascade ; // определенно не вызывайте "global $lang"
 +1339
 +1340        $ path = tpl_incdir () . 'lang/' ;
 +1341
 +1342        $ lang = [];
 +1343
 +1344        // не включайте один раз
 +1345        @include ( $ path.'en / lang.php ' ) ;
 +​​1346        foreach ($ config_cascade [ 'lang' ][ 'template' ] как $ config_file ) {
 +1347            если ( file_exists ($ config_file . $ conf [ 'template' ] . '/ en / lang.php ' )) {
 +1348                include ($ config_file .$ conf [ 'template' ]. '/ en / lang.php ' );
 +1349            }
 +1350        }
 +1351
 +1352        if ($ conf [ 'lang' ] != 'en' ) {
 +1353            @include ($ path .$ conf [ 'lang' ] . '/ lang.php ' );
 +1354            foreach ($ config_cascade [ 'lang' ][ 'template' ] как $ config_file ) {
 +1355                если ( file_exists ($ config_file . $ conf [ 'template' ] . '/' . $ conf [ 'lang' ] . '/ lang.php ' )) {
 +1356                    include ($ config_file .$ conf [ 'template' ]. '/' .$ conf [ 'lang' ]. '/ lang.php ' );
 +1357                }
 +1358            }
 +1359        }
 +1360    }
 +1361    вернуть $ lang [$ id ] ?? '' ;
 +1362}
 +1363
 +1364/**
 +1365* Извлечь файл, зависящий от языка, и передать его в xhtml-рендерер для отображения
 +1366* эквивалент шаблона p_locale_xhtml()
 +1367*
 +1368* @param  string $ id идентификатор страницы вики, зависящей от языка
 +1369* @return   string      анализирует содержимое страницы вики в формате xhtml
 +1370*/
 +1371функция  tpl_locale_xhtml ($ id )
 +1372{
 +1373    вернуть  p_cached_output ( tpl_localeFN ($ id ));
 +1374}
 +1375
 +1376/**
 +1377* Добавляет соответствующий путь к имени файла, зависящему от языка
 +1378*
 +1379* @param  string $ id идентификатор локализованного текста
 +1380* @return  string вики-текст
 +1381*/
 +1382функция  tpl_localeFN ($ id )
 +1383{
 +1384    $ path = tpl_incdir () . 'lang/' ;
 +1385    глобальная $ conf ;
 +1386    $ file = DOKU_CONF.'template_lang /'.$ conf [ 'template' ] . '/' .$ conf [ ' lang' ]. '/' .$ id . '.txt' ;
 +1387    если (! file_exists ($ file )) {
 +1388        $ file = $ path .$ conf [ 'lang' ]. '/' .$ id . '.txt' ;
 +1389        если (! file_exists ($ file )) {
 +1390            //возвращаемся к английскому
 +1391            $ file = $ path . 'en/' . $ id . '.txt' ;
 +1392        }
 +1393    }
 +1394    вернуть $ файл ;
 +1395}
 +1396
 +1397/**
 +1398* выводит «основной контент» во всплывающем окне медиаменеджера
 +1399*
 +1400* В зависимости от действий пользователя это может быть список
 +1401* файлы в пространстве имен, диалоговое окно редактирования метаданных или
 +1402* сообщение о ссылках на страницы
 +1403*
 +1404* Разрешено только в mediamanager.php
 +1405*
 +1406* @triggers МЕДИАМЕНЕДЖЕР_КОНТЕНТ_ВЫВОД
 +1407* @param  bool $ fromajax - установить true при вызове этой функции через ajax
 +1408* @param  string $ сортировка
 +1409*
 +1410* @автор Андреас Гор <andi@splitbrain.org>
 +1411*/
 +1412функция  tpl_mediaContent ($ fromajax = false , $ sort = 'natural' )
 +1413{
 +1414    глобальный $ IMG ;
 +1415    глобальная $ AUTH ;
 +1416    глобальный $ INUSE ;
 +1417    глобальный $ NS ;
 +1418    глобальный $ JUMPTO ;
 +1419    /** @var  Вход $INPUT */
 +1420    глобальный $ ВХОД ;
 +1421
 +1422    $ do = $ INPUT -> extract ( 'do' )-> str ( 'do' );
 +1423    если ( in_array ( $ do , [ 'сохранить' , 'отмена' ])) $ do = '' ;
 +1424
 +1425    если (!$ сделать ) {
 +1426        если ($ INPUT -> bool ( 'редактировать' )) {
 +1427            $ do = 'метаформа' ;
 +1428        } elseif ( is_array ($ INUSE )) {
 +1429            $ do = 'filesinuse' ;
 +1430        } еще {
 +1431            $ do = 'список_файлов' ;
 +1432        }
 +1433    }
 +1434
 +1435    // выводим панель содержимого, обернутую в событие.
 +1436    если (!$ fromajax ) echo  '<div id="media__content">' ;
 +1437    $ данные = [ 'делать' => $ делать ];
 +1438    $ evt = новое  событие ( 'MEDIAMANAGER_CONTENT_OUTPUT' , $ data );
 +1439    если ($ evt -> advice_before ()) {
 +1440        $ do = $ data [ 'do' ];
 +1441        если ($ do == 'filesinuse' ) {
 +1442            media_filesinuse ($ INUSE , $ IMG );
 +1443        } elseif ($ do == 'список файлов' ) {
 +1444            media_filelist ($ NS , $ AUTH , $ JUMPTO , false , $ sort );
 +1445        } elseif ($ do == 'searchlist' ) {
 +1446            media_searchlist ($ INPUT -> str ( 'q' ), $ NS , $ AUTH );
 +1447        } еще {
 +1448            msg ( 'Неизвестное действие ' . hsc ($ do ), -1 );
 +1449        }
 +1450    }
 +1451    $ evt -> advice_after ();
 +1452    снято ($ evt );
 +1453    если (!$ fromajax ) echo  '</div>' ;
 +1454}
 +1455
 +1456/**
 +1457* Печатает центральный столбец в полноэкранном медиа-менеджере
 +1458* В зависимости от открытой вкладки это может быть список
 +1459* файлы в пространстве имен, форма загрузки или форма поиска
 +1460*
 +1461* @author Катя Арзамасцева <pshns@ukr.net>
 +1462*/
 +1463функция  tpl_mediaFileList ()
 +1464{
 +1465    глобальная $ AUTH ;
 +1466    глобальный $ NS ;
 +1467    глобальный $ JUMPTO ;
 +1468    глобальный $ lang ;
 +1469    /** @var  Вход $INPUT */
 +1470    глобальный $ ВХОД ;
 +1471
 +1472    $ open_tab = $ INPUT -> str ( 'tab_files' );
 +1473    если (!$ open_tab || ! in_array ($ open_tab , [ 'файлы' , 'загрузка' , 'поиск' ])) $ open_tab = 'файлы' ;
 +1474    если ($ INPUT -> str ( 'mediado' ) == 'update' ) $ open_tab = 'upload' ;
 +1475
 +1476    echo  '<h2 class="a11y">' . $ lang [ 'mediaselect' ] . '</h2>' . NL ;
 +1477
 +1478    media_tabs_files ($ opened_tab );
 +1479
 +1480    echo  '<div class="panelHeader">' . NL ;
 +1481    эхо  '<h3>' ;
 +1482    $ tabTitle = $ NS ?: '[' . $ lang [ 'mediaroot' ] . ']' ;
 +1483    printf ($ lang [ 'media_' . $ open_tab ], '<strong>' . hsc ($ tabTitle ) . '</strong>' );
 +1484    эхо  '</h3>' . NL ;
 +1485    если ($ open_tab === 'поиск' || $ open_tab === 'файлы' ) {
 +1486        параметры_файлов_вкладки_медиа ();
 +1487    }
 +1488    эхо  '</div>' . NL ;
 +1489
 +1490    echo  '<div class="panelContent">' . NL ;
 +1491    если ($ open_tab == 'файлы' ) {
 +1492        media_tab_files ($ NS , $ AUTH , $ JUMPTO );
 +1493    } elseif ($ opened_tab == 'загрузить' ) {
 +1494        media_tab_upload ($ NS , $ AUTH , $ JUMPTO );
 +1495    } elseif ($ open_tab == 'поиск' ) {
 +1496        media_tab_search ($ NS , $ AUTH );
 +1497    }
 +1498    эхо  '</div>' . NL ;
 +1499}
 +1500
 +1501/**
 +1502* Печатает третий столбец в полноэкранном медиа-менеджере
 +1503* В зависимости от открытой вкладки это могут быть сведения о
 +1504* выбранный файл, диалоговое окно редактирования метаданных или
 +1505* список ревизий файлов
 +1506*
 +1507* @param  string $ изображение
 +1508* @param  boolean $ rev
 +1509*
 +1510* @author Катя Арзамасцева <pshns@ukr.net>
 +1511*/
 +1512функция  tpl_mediaFileDetails ($ image , $ rev )
 +1513{
 +1514    глобальный $ conf , $ DEL , $ lang ;
 +1515    /** @var  Вход $INPUT */
 +1516    глобальный $ ВХОД ;
 +1517
 +1518    $ удалено = (
 +1519        ! file_exists ( mediaFN ($ image )) &&
 +1520        file_exists ( mediaMetaFN ($ image , '.changes' )) &&
 +1521        $ conf [ 'mediarevisions' ]
 +1522    );
 +1523    если (!$ image || (! file_exists ( mediaFN ($ image )) && !$ removed ) || $ DEL ) return ;
 +1524    если ($ rev && ! file_exists ( mediaFN ( $ image , $ rev ))) $ rev = false ;
 +1525    $ ns = getNS ($ image );
 +1526    $ do = $ INPUT -> str ( 'mediado' );
 +1527
 +1528    $ open_tab = $ INPUT -> str ( 'tab_details' );
 +1529
 +1530    $ tab_array = [ 'view' ];
 +1531    [, $ mime ] = mimetype ($ image );
 +1532    если ($ mime == ' изображение / jpeg ' ) {
 +1533        $ tab_array [] = 'редактировать' ;
 +1534    }
 +1535    если ($ conf [ 'mediarevisions' ]) {
 +1536        $ tab_array [] = 'история' ;
 +1537    }
 +1538
 +1539    если (!$ open_tab || ! in_array ($ open_tab , $ tab_array )) $ open_tab = 'view' ;
 +1540    если ($ INPUT -> bool ( 'редактировать' )) $ open_tab = 'редактировать' ;
 +1541    если ($ do == 'restore' ) $ open_tab = 'view' ;
 +1542
 +1543    media_tabs_details ($ image , $ opened_tab );
 +1544
 +1545    echo  '<div class="panelHeader"><h3>' ;
 +1546    [$ ext ] = mimetype ($ image , false );
 +1547    $ class = preg_replace ( '/[^_\-a-z0-9]+/i' , '_' , $ ext );
 +1548    $ class = 'выберите медиафайл mf_' . $ class ;
 +1549
 +1550    $ атрибуты = $ rev ? [ 'rev' => $ rev ] : [];
 +1551    $ tabTitle = sprintf (
 +1552        '<strong><a href="%s" class="%s" title="%s">%s</a></strong>' ,
 +1553        мл ($ изображение , $ атрибуты ),
 +1554        $ класс ,
 +1555        $ lang [ 'mediaview' ],
 +1556        $ изображение
 +1557    );
 +1558    если ($ open_tab === 'view' && $ rev ) {
 +1559        printf ($ lang [ 'media_viewold' ], $ tabTitle , dformat ($ rev ));
 +1560    } еще {
 +1561        printf ($ lang [ 'media_' .$ opened_tab ],$ tabTitle );
 +1562    }
 +1563
 +1564    echo  '</h3></div>' . NL ;
 +1565
 +1566    echo  '<div class="panelContent">' . NL ;
 +1567
 +1568    если ($ open_tab == 'view' ) {
 +1569        media_tab_view ($ image , $ ns , null , $ rev );
 +1570    } elseif ($ opening_tab == 'edit' && !$ removed ) {
 +1571        media_tab_edit ($ image , $ ns );
 +1572    } elseif ($ opened_tab == 'history' && $ conf [ 'mediarevisions' ]) {
 +1573        media_tab_history ($ image , $ ns );
 +1574    }
 +1575
 +1576    эхо  '</div>' . NL ;
 +1577}
 +1578
 +1579/**
 +1580* выводит дерево пространства имен во всплывающем окне медиаменеджера
 +1581*
 +1582* Разрешено только в mediamanager.php
 +1583*
 +1584* @автор Андреас Гор <andi@splitbrain.org>
 +1585*/
 +1586функция  tpl_mediaTree ()
 +1587{
 +1588    глобальный $ NS ;
 +1589    эхо  '<div id="media__tree">' ;
 +1590    media_nstree ($ NS );
 +1591    эхо  '</div>' ;
 +1592}
 +1593
 +1594/**
 +1595* Распечатать выпадающее меню со всеми действиями DokuWiki
 +1596*
 +1597* Примечание: здесь не будут использоваться красивые URL-адреса.
 +1598*
 +1599* @param  string $ пусто пустая метка параметра
 +1600* @param  string $ кнопка подписи кнопки отправки
 +1601*
 +1602* @автор Андреас Гор <andi@splitbrain.org>
 +1603* @deprecated 2017-09-01 см. devel:menus
 +1604*/
 +1605функция  tpl_actiondropdown ($ empty = '' , $ button = '>' )
 +1606{
 +1607    dbg_deprecated ( 'см. devel:menus' );
 +1608    $ menu = new  MobileMenu ();
 +1609    echo $ menu -> getDropdown ($ empty , $ button );
 +1610}
 +1611
 +1612/**
 +1613* Распечатать информационную строку об использованной лицензии
 +1614*
 +1615* @param  string $ img распечатать изображение? (|кнопка|значок)
 +1616* @param  bool $ imgonly пропустить текстовое описание?
 +1617* @param  bool $ return, если true, не печатать, а возвращать HTML
 +1618* @param  bool $ обернуть в div с class="license"?
 +1619* @возвращаемая  строка
 +1620*
 +1621* @автор Андреас Гор <andi@splitbrain.org>
 +1622*/
 +1623функция  tpl_license ($ img = 'badge' , $ imgonly = false , $ return = false , $ wrap = true )
 +1624{
 +1625    глобальная лицензия $ ;
 +1626    глобальная $ conf ;
 +1627    глобальный $ lang ;
 +1628    если (!$ conf [ 'license' ]) вернуть  '' ;
 +1629    если (! is_array ($ license [$ conf [ 'license' ]])) вернуть  '' ;
 +1630    $ lic = $ license [$ conf [ 'license' ]];
 +1631    $ target = ($ conf [ 'target' ][ 'extern' ]) ? ' target="' . $ conf [ 'target' ][ 'extern' ] . '"' : '' ;
 +1632
 +1633    $ out = '' ;
 +1634    если ($ wrap ) $ out .= '<div class="license">' ;
 +1635    если ($ img ) {
 +1636        $ src = license_img ($ img );
 +1637        если ($ ист ) {
 +1638            $ out .= '<a href="' . $ lic [ 'url' ] . '" rel="лицензия"' . $ target ;
 +1639            $ out .= '><img src="' . DOKU_BASE . $ src . '" alt="' . $ lic [ 'name' ] . '" /></a>' ;
 +1640            если (!$ imgonly ) $ out .= ' ' ;
 +1641        }
 +1642    }
 +1643    если (!$ imgonly ) {
 +1644        $ out .= $ lang [ 'license' ] . ' ' ;
 +1645        $ out .= '<bdi><a href="' . $ lic [ 'url' ] . '" rel="license" class="urlextern"' . $ target ;
 +1646        $ out .= '>' . $ lic [ 'имя' ] . '</a></bdi>' ;
 +1647    }
 +1648    если ($ wrap ) $ out .= '</div>' ;
 +1649
 +1650    если ($ return ) вернуть $ out ;
 +1651    вывести $ ;
 +​1652    возвращаться  '' ;
 +1653}
 +1654
 +1655/**
 +1656* Включает визуализированный HTML-код указанной страницы
 +1657*
 +1658* Эта функция полезна для заполнения боковых панелей или подобных функций в
 +1659* шаблон
 +1660*
 +1661* @param  string $ pageid Имя страницы, которую вы хотите включить
 +1662* @param  bool $ print Следует ли печатать содержимое или только возвращать его
 +1663* @param  bool $ propagate Искать также и в более высоких пространствах имен?
 +1664* @param  bool $ useacl Включать страницу только в том случае, если списки контроля доступа проверены?
 +1665* @return  bool | null | строка
 +1666*/
 +1667функция  tpl_include_page ($ pageid , $ print = true , $ propagate = false , $ useacl = true )
 +1668{
 +1669    если ($ распространять ) {
 +1670        $ pageid = page_findnearest ($ pageid , $ useacl );
 +1671    } elseif ($ useacl && auth_quickaclcheck ($ pageid ) == AUTH_NONE ) {
 +1672        вернуть  ложь ;
 +1673    }
 +1674    если (!$ pageid ) вернуть  false ;
 +1675
 +1676    глобальный $ TOC ;
 +1677    $ oldtoc = $ TOC ;
 +1678    $ html = p_wiki_xhtml ($ pageid , '' , false );
 +1679    $ TOC = $ oldtoc ;
 +1680
 +1681    если ($ print ) echo $ html ;
 +1682    вернуть $ html ;
 +1683}
 +1684
 +1685/**
 +1686* Отобразить форму подписки
 +1687*
 +1688* @автор Адриан Лэнг <lang@cosmocode.de>
 +1689* @устаревший 2020-07-23
 +1690*/
 +1691функция  tpl_subscribe ()
 +1692{
 +1693    dbg_deprecated ( Подписаться :: класс . '::show()' );
 +1694    ( новая  Подписка ())-> показать ();
 +1695}
 +1696
 +1697/**
 +1698* Пытается отправить уже созданный контент прямо в браузер
 +1699*
 +1700* Оборачивает ob_flush() и flush()
 +1701*
 +1702* @автор Андреас Гор <andi@splitbrain.org>
 +1703*/
 +1704функция  tpl_flush ()
 +1705{
 +1706    если ( ob_get_level () > 0 ) ob_flush ();
 +1707    румянец ();
 +1708}
 +1709
 +1710/**
 +1711* Пытается найти файл ресурсов в указанных местах.
 +1712*
 +1713* Если указанное местоположение начинается с двоеточия, предполагается, что это медиа
 +1714* файл, в противном случае предполагается, что он относится к текущему шаблону
 +1715*
 +1716* @параметр  строка []$ поиск мест для просмотра
 +1717* @param  bool $ abs , если использовать абсолютный URL
 +1718* @param  массив     &$imginfo заполнен с помощью getimagesize()
 +1719* @param  bool $ fallback использовать резервное изображение, если цель не найдена, или вернуть «false», если она потенциальная
 +1720* требуется ложный результат
 +1721* @возвращаемая  строка
 +1722*
 +1723* @автор Андреас Гор <andi@splitbrain.org>
 +1724*/
 +1725функция  tpl_getMediaFile ($ search , $ abs = false , &$ imginfo = null , $ fallback = true )
 +1726{
 +1727    $ img = '' ;
 +1728    $ файл = '' ;
 +1729    $ ismedia = false ;
 +1730    // перебираем кандидатов, пока не будет найдено совпадение:
 +1731    foreach ($ поиск  как $ img ) {
 +1732        если ( str_starts_with ($ img , ':' )) {
 +1733            $ file = mediaFN ($ img );
 +1734            $ ismedia = true ;
 +1735        } еще {
 +1736            $ file = tpl_incdir () . $ img ;
 +1737            $ ismedia = false ;
 +1738        }
 +1739
 +1740        если ( file_exists ($ file )) прерывание ;
 +1741    }
 +1742
 +1743    // управлять несуществующей целью
 +1744    если (! file_exists ($ file )) {
 +1745        // дать результат для резервного изображения
 +1746        если ($ откат ) {
 +1747            $ file = DOKU_INC . ' lib / images / blank.gif ' ;
 +1748            // остановить процесс, если требуется ложный результат (если $fallback равен false)
 +1749        } еще {
 +1750            вернуть  ложь ;
 +1751        }
 +1752    }
 +1753
 +1754    // извлечь данные изображения, если требуется
 +1755    если (! is_null ($ imginfo )) {
 +1756        $ imginfo = getimagesize ($ file );
 +1757    }
 +1758
 +1759    // создать URL
 +1760    если ($ ismedia ) {
 +1761        $ url = ml ($ img , '' , true , '' , $ abs );
 +1762    } еще {
 +1763        $ url = tpl_basedir (). $ изображение ;
 +1764        если ($ abs ) $ url = DOKU_URL.substr ( $ url , strlen ( DOKU_REL ))
 + ;1765    }
 +1766
 +1767    вернуть $ url ;
 +1768}
 +1769
 +1770/**
 +1771* PHP включает файл
 +1772*
 +1773* либо из каталога conf, если он существует, в противном случае используйте
 +1774* файл в корневом каталоге шаблона.
 +1775*
 +1776* Функция учитывает настройки каскада конфигураций и ищет заданные
 +1777* файл рядом с «основными» файлами конфигурации, в порядке защищенный, локальный,
 +1778* по умолчанию.
 +1779*
 +1780* Примечание: здесь не выполняется экранирование или проверка на работоспособность. Никогда не передавайте пользовательский ввод
 +1781* к этой функции!
 +1782*
 +1783* @param  string $ файл
 +1784*
 +1785* @автор Андреас Гор <andi@splitbrain.org>
 +1786* @автор Аника Хенке <anika@selfthinker.org>
 +1787*/
 +1788функция  tpl_includeFile ($ файл )
 +1789{
 +1790    глобальный $ config_cascade ;
 +1791    foreach ([ 'protected' , 'local' , 'default' ] как $ config_group ) {
 +1792        если ( пусто ($ config_cascade [ 'main' ][$ config_group ])) продолжить ;
 +1793        foreach ($ config_cascade [ 'main' ][$ config_group ] как $ conf_file ) {
 +1794            $ dir = имя_каталога ($ conf_file );
 +1795            если ( file_exists ( " $ dir / $ file " )) {
 +1796                include ( " $ dir / $ file " );
 +1797                возвращаться ;
 +1798            }
 +1799        }
 +1800    }
 +1801
 +1802    // все еще здесь? попробуйте шаблон dir
 +1803    $ file = tpl_incdir () . $ file ;
 +1804    если ( file_exists ($ file )) {
 +1805        включить ($ файл );
 +1806    }
 +1807}
 +1808
 +1809/**
 +1810* Возвращает тег <link> для различных типов иконок (favicon|mobile|generic)
 +1811*
 +1812* @param  array $ types - список типов иконок для отображения (favicon|mobile|generic)
 +1813* @возвращаемая  строка
 +1814*
 +1815* @автор Аника Хенке <anika@selfthinker.org>
 +1816*/
 +1817функция  tpl_favicon ($ types = [ 'favicon' ])
 +1818{
 +1819
 +1820    $ return = '' ;
 +1821
 +1822    foreach ($ типы  как $ тип ) {
 +1823        переключатель ($ тип ) {
 +1824            случай  'favicon' :
 +1825                $ look = [ ':wiki:favicon.ico' , ':favicon.ico' , ' изображения / favicon.ico ' ];
 +1826                $ return .= '<link rel="значок ярлыка" href="' . tpl_getMediaFile ($ look ) . '" />' . NL ;
 +1827                перерыв ;
 +1828            случай  «мобильный» :
 +1829                $ look = [ ':wiki:apple-touch-icon.png' , ':apple-touch-icon.png' , ' изображения / apple-touch-icon.png ' ];
 +1830                $ return .= '<link rel="apple-touch-icon" href="' . tpl_getMediaFile ($ look ) . '" />' . NL ;
 +1831                перерыв ;
 +1832            случай  «общий» :
 +1833                // идеальное решение, которое пока не работает ни в одном браузере
 +1834                $ look = [ ':wiki:favicon.svg' , ':favicon.svg' , ' изображения / favicon.svg ' ];
 +1835                $ return .= '<link rel="icon" href="' . tpl_getMediaFile ($ look ) . '" type=" image / svg +xml" />' . NL ;
 +1836                перерыв ;
 +1837        }
 +1838    }
 +1839
 +1840    возврат $ возврат ;
 +1841}
 +1842
 +1843/**
 +1844* Печать полноэкранного медиа-менеджера
 +1845*
 +1846* @author Катя Арзамасцева <pshns@ukr.net>
 +1847*/
 +1848функция  tpl_media ()
 +1849{
 +1850    глобальные $ NS , $ IMG , $ JUMPTO , $ REV , $ lang , $ fullscreen , $ INPUT ;
 +1851    $ полноэкранный = правда ;
 +1852    require_once  DOKU_INC . ' lib / exe / mediamanager.php ' ;
 +1853
 +1854    $ rev = '' ;
 +1855    $ image = cleanID ($ INPUT -> str ( 'image' ));
 +1856    если ( isset ($ IMG )) $ image = $ IMG ;
 +1857    если ( isset ($ JUMPTO )) $ image = $ JUMPTO ;
 +1858    если ( isset ($ REV ) && !$ JUMPTO ) $ rev = $ REV ;
 +1859
 +1860    echo  '<div id="mediamanager__page">' . NL ;
 +1861    эхо  '<h1>' . $ язык [ 'btn_media' ] . '</h1>' . НЛ ;
 +1862    html_msgarea ();
 +1863
 +1864    echo  '<div class="panel namespaces">' . NL ;
 +1865    echo  '<h2>' . $ lang [ 'пространства имен' ] . '</h2>' . NL ;
 +1866    echo  '<div class="panelHeader">' ;
 +1867    echo $ lang [ 'media_namespaces' ];
 +1868    эхо  '</div>' . NL ;
 +1869
 +1870    echo  '<div class="panelContent" id="media__tree">' . NL ;
 +1871    media_nstree ($ NS );
 +1872    эхо  '</div>' . NL ;
 +1873    эхо  '</div>' . NL ;
 +1874
 +1875    echo  '<div class="panel filelist">' . НЛ ;
 +1876    tpl_mediaFileList ();
 +1877    эхо  '</div>' . NL ;
 +1878
 +1879    echo  '<div class="panel file">' . NL ;
 +1880    echo  '<h2 class="a11y">' . $ lang [ 'media_file' ] . '</h2>' . NL ;
 +1881    tpl_mediaFileDetails ($ image , $ rev );
 +1882    эхо  '</div>' . NL ;
 +1883
 +1884    эхо  '</div>' . NL ;
 +1885}
 +1886
 +1887/**
 +1888* Возвращаем полезные классы макета
 +1889*
 +1890* @возвращаемая  строка
 +1891*
 +1892* @автор Аника Хенке <anika@selfthinker.org>
 +1893*/
 +1894функция  tpl_classes ()
 +1895{
 +1896    глобальные $ ACT , $ conf , $ ID , $ INFO ;
 +1897    /** @var  Вход $INPUT */
 +1898    глобальный $ ВХОД ;
 +1899
 +1900    $ классы = [
 +1901        'dokuwiki' ,
 +1902        'mode_' . $ ACT ,
 +1903        'tpl_' . $ conf [ 'шаблон' ],
 +1904        $ INPUT -> сервер -> bool ( 'REMOTE_USER' ) ? 'loggedIn' : '' ,
 +1905        ( isset ($ INFO [ 'существует' ]) && $ INFO [ 'существует' ]) ? '' : 'notFound' ,
 +1906        ($ ID == $ conf [ 'start' ]) ? 'home' : ''
 +1907    ];
 +1908    return  implode ( ' ' , $ classes );
 +1909}
 +1910
 +1911/**
 +1912* Создать событие для меню инструментов
 +1913*
 +1914* @param  string $ toolsname имя меню
 +1915* @param  массив $ элементы
 +1916* @param  string $ view например 'main', 'detail', ...
 +1917*
 +1918* @автор Аника Хенке <anika@selfthinker.org>
 +1919* @deprecated 2017-09-01 см. devel:menus
 +1920*/
 +1921функция  tpl_toolsevent ($ toolsname , $ items , $ view = 'main' )
 +1922{
 +1923    dbg_deprecated ( 'см. devel:menus' );
 +1924    $ data = [ 'view' => $ view , 'items' => $ items ];
 +1925
 +1926    $ hook = 'TEMPLATE_' . strtoupper ($ toolsname ) . '_DISPLAY' ;
 +1927    $ evt = новое  событие ($ hook , $ data );
 +1928    если ($ evt -> advice_before ()) {
 +1929        foreach ($ evt -> data [ 'items' ] as $ html ) echo $ html ;
 +1930    }
 +1931    $ evt -> advice_after ();
 +1932}
 +1933
 +</code>
 +</details>
wiki/xref/dokuwiki/inc/template.php.1724622865.txt.gz · Последнее изменение: vladpolskiy