Exemplo n.º 1
0
 /**
  * Селектор файлов
  * @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);
 }
Exemplo n.º 2
0
 /**
  * Преобразование строки 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;
 }
Exemplo n.º 3
0
 /**
  * Модификация шаблона 
  * @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);
 }
Exemplo n.º 4
0
 /**
  * Удаление аватары пользователя
  * @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);
     }
 }
Exemplo n.º 5
0
 /**
  * Замена смайликов
  * @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|\\&nbsp\\;|^)' . mpc($code) . '(\\s|\\&nbsp\\;|$)/siu', " <img src=\"" . config::o()->v('smilies_folder') . "/" . $image . "\" \n                                alt=\"" . $name . "\" \n                                title=\"" . $name . "\"> ", $input);
             }
         }
     }
 }
Exemplo n.º 6
0
 /**
  * Выборка старых скриншотов
  * @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);
 }
Exemplo n.º 7
0
 /**
  * Замена 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;
 }
Exemplo n.º 8
0
 /**
  * Поиск/замена в файлах
  * @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;
 }