/** * Селектор файлов * @param string $current данное значение * @param string $type тип(file или tpl) * @return string HTML код */ public function files_selector($current, $type = 'file') { switch ($type) { case "file": $path = MODULES_PATH . '/' . BLOCKS_PATH; $regexp = '(\\w+)\\.php'; $empty = false; break; case "tpl": // Разрешим пустой блок //$allblock = '|' . mpc(blocks::allblock); $path = cut_path(tpl::o()->get_template_dir()) . blocks::blocks_path; $regexp = '(?(?=(?:(?:' . implode('|', array_map('mpc', self::$types)) . ')' . mpc(blocks::block_standart) . ')' . $allblock . ')\\/|(\\w+))\\.tpl'; $empty = true; break; default: return; } return input::o()->scurrent($current)->snull($empty)->select_folder($type, $path, false, '/^' . $regexp . '$/siu', 1); }
/** * Преобразование строки ID в массив, * разделённая делимиттером(по-умолчанию "|") и * знаком интервала, означающим "от" и "до"(по-умолчанию "-") * @param string $input исходная строка * @param string $del делимиттер * @param string $interval знак интервала * @return array искомый массив */ public function idstring2array($input, $del = "|", $interval = "-") { if (!preg_match('/^(\\d+(\\-\\d+)?\\|)+$/', $input . '|')) { return; } if (!$del) { $del = "|"; } $this->tmp_delim = $del; if ($interval) { $input = preg_replace_callback('/(\\d+)' . mpc($interval) . '(\\d+)/iu', array($this, 'between_string'), $input); } $input = explode($del, $input); return $input; }
/** * Модификация шаблона * @param string $f файл шаблона(относительно дирректории, с расширением) * @param string $what что заменять? (рег. выражение без делимиттеров) * @param string $with чем заменять? Чтобы добавить, достаточно дописать * $0 в нужное место, ибо работает рег. выражение в любом случае. * !Использовать только вставки вида ${номер группы}, для рег. выражений. * @param bool $regexp рег. выражение? * @param string $folder дирректория шаблонов * @return bool|int 2, если все шаблоны успешно изменены, true, если стандартный шаблон * успешно изменён * @note CSS, JS не нужно модифицировать, проще подцепить свой, * ибо всё переопределяемо. * @see join_js() * @see join_css() */ public function modify_template($f, $what, $with = "", $regexp = false, $folder = null) { if (!$what) { return false; } $f = validpath($f); $ft = file::o()->get_filetype($f); if (!$f || $ft != 'tpl' && $ft != 'xtpl') { return false; } if (!$regexp && !$this->insert) { $what = mpc($what); $what = preg_replace('/\\s+/s', '\\s+', $what); // не учитываем пробелы $regexp = true; } if (!$folder) { $b = 0; $dir = file::o()->open_folder(THEMES_PATH, true); $c = count($dir); $cb = true; for ($i = 0; $i < $c; $i++) { $cur = $dir[$i]; $r = $this->modify_template($f, $what, $with, $regexp, $cur); if ($cur == config::o()->v('default_style')) { $cb = $r; } $b += $r; } return !$cb ? false : $b == $c + $cb; } if ($this->insert) { $what = "<!-- inserted by plugin at time " . time() . ". begin-->\n" . $what . "\n<!-- inserted by plugin. end-->"; } elseif (!$this->comment) { $with = "<!-- " . crc32($what) . " replaced by plugin at time " . time() . ". begin-->\n" . $with . "\n<!-- replaced by plugin. end-->"; } // для обратной замены $p = THEMES_PATH . '/' . $folder . '/' . TEMPLATES_PATH . '/' . $f; if (!file_exists(ROOT . $p)) { return true; } // ибо может наследовать $ftpl = file_get_contents(ROOT . $p); if (!$this->replaced[$p]) { $this->replaced[$p] = array(); } if (!$this->insert) { $this->tmp_with = $with; $this->treplaced = array(); $ftpl = preg_replace_callback('/' . $what . '/siu', array($this, "replace_callback"), $ftpl); $this->replaced[$p][] = $this->treplaced; } else { if ($this->insert == 1) { $ftpl = $what . $ftpl; } else { $ftpl = $ftpl . $what; } $this->replaced[$p][] = array(array("", $what)); } return file::o()->write_file($ftpl, $p); }
/** * Удаление аватары пользователя * @param int $id ID пользователя * @param string $avatar значение поля vatar пользователя * @return null */ public function remove_user_avatar($id, $avatar) { /* @var $uploader uploader */ $uploader = n("uploader"); $avatar_name = display::avatar_prefix . $id; $aft = $uploader->filetypes('avatars'); if (preg_match('/^' . mpc($avatar_name) . '\\.(' . str_replace(";", "|", $aft['types']) . ')$/siu', $avatar)) { @unlink(ROOT . config::o()->v('avatars_folder') . "/" . $avatar); } }
/** * Замена смайликов * @param string $input входящий текст * @return null */ protected function smilies_replace(&$input) { if (!$this->smilies) { return; } foreach ($this->smilies as $smilies_pack) { if ($smilies_pack) { foreach ($smilies_pack as $smilie) { $code = display::o()->html_encode($smilie['code']); $image = $smilie['image']; $name = $smilie['name']; // preg_replace с модификатором i намного быстрее str_ireplace $input = preg_replace('/(\\s|\\ \\;|^)' . mpc($code) . '(\\s|\\ \\;|$)/siu', " <img src=\"" . config::o()->v('smilies_folder') . "/" . $image . "\" \n alt=\"" . $name . "\" \n title=\"" . $name . "\"> ", $input); } } } }
/** * Выборка старых скриншотов * @param string $old старый сериализованный массив скриншотов * @param string $purl начало имени скриншотов * @param array $surl массив загружаемых с URL * @param array $sfile массив загружаемых файлами * @return array массив массива скриншотов и имени последнего */ protected function screenshots_old(&$old, $purl, $surl, $sfile) { if (!$old) { return array(array(), 0); } $r = array(); $l = null; $old = @unserialize($old); foreach ($old as $n => $c) { if (!isset($surl[$n]) && !isset($sfile[$n]) && $n > 1) { // удалено тобишь, но не 1-й скриншот и постер $this->check_isfile($old[$n]); continue; } if (is_array($old[$n])) { $l = $old[$n][0]; } $r[$n] = $c; // если надо будет - перезапишется } $fi = 0; if ($l) { preg_match('/^' . mpc($purl) . '([0-9]+)\\./', $l, $matches); $fi = $matches[1] + 1; } return array($r, $fi); }
/** * Замена passkey в URL трекера на настройки пользователя * @param string $url URL трекера * @param string|array $pk строка из конфига * @return bool true, в случае успешной замены */ protected function pk_replace(&$url, &$pk) { if (!is_array($pk)) { $pk = preg_split('/\\s+/', trim($pk)); } list($host, $pk_s, $pk_e) = $pk; if (!$host || !$pk_s) { return; } if (!preg_match('/^' . display::url_pattern . '$/siu', $url, $m)) { return; } if (mb_strpos($m[3] . ':' . $m[4], $host) === false) { return; } $apk = users::o()->v('announce_pk'); $url = preg_replace('/(' . mpc($pk_s) . ')(.*?)(' . ($pk_e ? mpc($pk_e) : "\$") . ')/siu', '$1' . $apk[$host] . '$3', $url); return true; }
/** * Поиск/замена в файлах * @param string|array $dir путь к дирректории или массив файлов * @param string $what что ищем? (рег. выражение без делимиттеров) * @param bool $regexp регулярное выражение? * @param int $where где ищем?(для массива, 0 - в значениях, 1 - в ключах, 2 - и там, и там) * если указать -1, то не будет проверяться, слово ли ключ, а поиск будет по значению * @param callback $callback callback функция для получения контента файла * единственный параметр функции - путь к файлу * @param string $was пред. путь(для рекурсии) * @return array массив файлов(ключи) и подсвеченных результатов(значения) */ public function search_infiles($dir, $what, $regexp = false, $where = null, $callback = null, $was = '') { if (!$dir || !$what) { return; } if (!is_array($dir) && is_dir(ROOT . $dir)) { $files = file::o()->open_folder($dir); } else { $dir = $files = (array) $dir; } $r = array(); if (!$regexp) { $what = mpc($what); $regexp = true; } elseif (!$was) { $what = str_replace('/', '\\/', $what); } $owhat = $what; if (is_null($this->infiles_replace)) { $what = display::o()->html_encode($what); } $what = '/(' . $what . ')/siu'; $where = (int) $where; foreach ($files as $f) { if (!is_array($dir)) { $nf = $dir . '/' . $f; $wf = ($was ? $was . '/' : '') . $f; } else { $wf = $nf = $f; } if (!$f) { return; } $fr = ROOT . $nf; if (is_dir($fr)) { if (!is_array($dir)) { $r = array_merge($r, $this->search_infiles($nf, $owhat, $regexp, $where, $callback, $wf)); } continue; } if ($callback) { $c = call_user_func($callback, $nf); } else { $c = file_get_contents($fr); } if (!$c) { continue; } if (!is_array($c)) { $this->search_infiles_na($r, $fr, $what, $nf, $wf); continue; } if (!is_null($this->infiles_replace) && !$this->infiles_replace_cb) { continue; } $this->search_infiles_a($r, $c, $what, $where, $nf, $wf); } if (!$was) { $this->replace_infiles(null, null); } return $r; }