public function widget($args, $instance) { global $bg_bibfers_url, $bg_bibfers_bookTitle, $bg_bibfers_shortTitle, $bg_bibfers_bookFile; $title = $instance["title"]; $ref = $instance["ref"]; $lang = $instance["lang"]; if (!$lang) { $lang = set_bible_lang(); } $lang = include_books($lang); $num_books = count($bg_bibfers_bookTitle); $books = array_keys($bg_bibfers_bookTitle); ?> <aside id="bg-bibrefs-3" class="widget widget_bg-bibrefs"> <h2 class="widget-title"><?php echo $title; ?> </h2> <p> <?php $quote = bg_bibfers_get_bible_epigraph($ref, $lang); echo $quote; ?> </p> </aside> <?php }
function bg_bibfers_search_result($context, $type, $lang, $prll = '') { global $bg_bibfers_option; global $bg_bibfers_chapter, $bg_bibfers_ch; global $bg_bibfers_url, $bg_bibfers_bookTitle, $bg_bibfers_shortTitle, $bg_bibfers_bookFile; $lang = include_books($lang); bg_bibfers_get_options(); $verses = ""; $bkr = ""; /******************************************************************************* Построение паттерна *******************************************************************************/ // echo "context=". $context. "<br>"; // Отладка $pattern = trim($context); // убираем пробелы по краям $pattern = preg_replace("/\\s+/ui", ' ', $pattern); // удаляем двойные пробелы $pattern = preg_replace("/\\\\/ui", '\\', $pattern); // переобразуем спецсимвол в обычный \ $pattern = preg_replace("/\\//ui", '\\/', $pattern); // переобразуем спецсимвол в обычный / $pattern = preg_replace("/\\^/ui", '\\^', $pattern); // переобразуем спецсимвол в обычный ^ $pattern = preg_replace("/\\?/ui", '\\?', $pattern); // переобразуем спецсимвол в обычный ? $pattern = preg_replace("/\\./ui", '\\.', $pattern); // переобразуем спецсимвол в обычный . $pattern = preg_replace("/\\+/ui", '\\+', $pattern); // переобразуем спецсимвол в обычный + $pattern = preg_replace("/\\{/ui", '\\{', $pattern); // переобразуем спецсимвол в обычный { $pattern = preg_replace("/\\}/ui", '\\}', $pattern); // переобразуем спецсимвол в обычный } $pattern = preg_replace("/\\(/ui", '\\(', $pattern); // переобразуем спецсимвол в обычный ( $pattern = preg_replace("/\\)/ui", '\\)', $pattern); // переобразуем спецсимвол в обычный ) $pattern = preg_replace("/\\[/ui", '\\[', $pattern); // переобразуем спецсимвол в обычный [ $pattern = preg_replace("/\\]/ui", '\\]', $pattern); // переобразуем спецсимвол в обычный ] $pattern = preg_replace("/\\\$/ui", '\\w', $pattern); // $ - строго 1 любая буква $pattern = preg_replace("/\\%/ui", '\\w?', $pattern); // % - 0 или 1 любая буква $pattern = preg_replace("/\\*/ui", '\\w*', $pattern); // * - 0 или несколько любых букв $pattern = preg_replace("/\\s/ui", '\\s*', $pattern); // пробельные символы в тексте Библии могут быть любыми $pattern = "/\\b" . $pattern . "\\b/ui"; // Только целое слово // echo "pattern=". $pattern. "<br>"; // Отладка /******************************************************************************* Организуем просмотр всех книг Библии *******************************************************************************/ foreach ($bg_bibfers_bookFile as $book => $book_file) { $book_file = 'bible/' . $book_file; // Имя файла книги /******************************************************************************* Чтение и преобразование файла книги *******************************************************************************/ // Получаем данные из файла $code = false; if ($bg_bibfers_option['fgc'] == 'on' && function_exists('file_get_contents')) { // Попытка1. Если данные не получены попробуем применить file_get_contents() $url = dirname(dirname(__FILE__)) . '/' . $book_file; // Локальный URL файла $code = file_get_contents($url); } if ($bg_bibfers_option['fopen'] == 'on' && !$code) { // Попытка 2. Если данные опять не получены попробуем применить fopen() $url = dirname(dirname(__FILE__)) . '/' . $book_file; // Локальный URL файла $ch = fopen($url, "r"); // Открываем файл для чтения if ($ch) { while (!feof($ch)) { $code .= fread($ch, 2097152); // загрузка текста (не более 2097152 байт) } fclose($ch); // Закрываем файл } } if ($bg_bibfers_option['curl'] == 'on' && function_exists('curl_init') && !$code) { // Попытка3. Если установлен cURL $url = plugins_url($book_file, dirname(__FILE__)); // URL файла $ch = curl_init($url); // создание нового ресурса cURL curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // возврат результата передачи в качестве строки из curl_exec() вместо прямого вывода в браузер $code = curl_exec($ch); // загрузка текста $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != '200') { $code = false; } // Проверка на код http 200 curl_close($ch); // завершение сеанса и освобождение ресурсов } if (!$code) { return ""; } // Увы. Паранойя хостера достигла апогея. Файл не прочитан или ошибка // Преобразовать json в массив $json = json_decode($code, true); /******************************************************************************* Поиск вхождения в текст стиха Библии и формирование результатов поиска *******************************************************************************/ $cn_json = count($json); $chr = 0; for ($i = 0; $i < $cn_json; $i++) { if (!preg_match($pattern, $json[$i]['text'])) { continue; } // Если нет вхождений ищем в следующем стихе if ($bkr != $book) { if ($type == "book") { $verses = $verses . "<h3>" . bg_bibfers_getTitle($book) . "</h3>"; } else { if ($type == "t_verses") { $verses = $verses . "<strong>" . bg_bibfers_getTitle($book) . "</strong><br>"; } } $bkr = $book; } $ch = (int) $json[$i]['part']; $vr = (int) $json[$i]['stix']; $verses = $verses . bg_bibfers_printVerses($json, $book, $chr, $ch, $ch, $vr, $vr, $type, $lang, $prll); $chr = $ch; } } $verses = preg_replace($pattern, '<strong class="search-excerpt">\\0</strong>', $verses); if (!$verses) { $verses = '<p>«<strong class="search-excerpt">' . $context . '</strong>» — ' . __('sorry, but nothing matched your search terms. Please try again with some different keywords.', 'bg_bibfers') . '</p>'; } return $verses; }
function bg_bibfers_bible_proc($txt, $type = '', $lang = '', $prll = '') { global $post; global $bg_bibfers_option; global $bg_bibfers_all_refs; global $bg_bibfers_chapter, $bg_bibfers_ch; global $bg_bibfers_url, $bg_bibfers_bookTitle, $bg_bibfers_shortTitle, $bg_bibfers_bookFile; bg_bibfers_get_options(); /****************** ОТЛАДКА ****************************************/ if ($bg_bibfers_option['debug']) { $debug_file = dirname(dirname(__FILE__)) . "/debug.log"; if (file_exists($debug_file)) { $size = filesize($debug_file); $lasttime = filectime($debug_file); if ($lasttime + 30 * 60 < time() || $size > 2 * 1024 * 1024) { unlink($debug_file); } } $start_time = microtime(true) * 1000; $s_time = $start_time; error_log(date('d.m.Y h:i:s') . ": " . get_permalink() . "\n", 3, $debug_file); } /*******************************************************************/ if (!$lang) { $lang = set_bible_lang(); } $lang = include_books($lang); $norefs_posts_val = get_post_meta($post->ID, 'norefs', true); if ($norefs_posts_val || in_category('norefs') || has_tag('norefs')) { return $txt; } // Ищем все вхождения ссылок <a ...</a>, заголовков <h. ... </h.> и шорт-кодов [norefs]...[/norefs] и [bible]...[/bible] preg_match_all("/<a\\s.*?<\\/a>/sui", $txt, $hdr_a, PREG_OFFSET_CAPTURE); preg_match_all("/<h([1-6])(.*?)<\\/h\\1>/sui", $txt, $hdr_h, PREG_OFFSET_CAPTURE); preg_match_all("/\\[norefs.*?\\[\\/norefs\\]/sui", $txt, $hdr_norefs, PREG_OFFSET_CAPTURE); preg_match_all("/\\[bible.*?\\[\\/bible\\]/sui", $txt, $hdr_bible, PREG_OFFSET_CAPTURE); // Ищем все вхождения ссылок на Библию // $template = "/[\\(\\[](см\\.?\\:?(\\s| \\;)*)?(\\d?(\\s| \\;)*[А-яA-z]{2,8})((\\.|\\s| \\;)*)(\\d+((\\s| \\;)*[\\:\\,\\-—–](\\s| \\;)*\\d+)*)(\\s| \\;)*[\\]\\)]/ui"; // $template = "/(\\s| \\;)?\\(?\\[?((\\s| \\;)*см\\.?\\:?(\\s| \\;)*)?(\\d?(\\s| \\;)*[А-яA-z]{2,8})((\\.|\\s| \\;)*)(\\d+((\\s| \\;)*[\\:\\,\\-—–](\\s| \\;)*\\d+)*)(\\s| \\;)*[\\]\\)\\.]?/ui"; // $template = "/(\\s| \\;)?\\(?\\[?((\\s| \\;)*см\\.?\\:?(\\s| \\;)*)?(\\d?(\\s| \\;)*[А-яA-z]{2,8})((\\.|\\s| \\;)*)(\\d+((\\s| \\;)*[\\:\\;\\,\\.\\-—–](\\s| \\;)*\\d+)*)(\\s| \\;)*[\\]\\)\\.]?/ui"; // $template = "/(\\s| \\;)?\\(?\\[?((\\s| \\;)*см\\.?\\:?(\\s| \\;)*)?(\\d?(\\s| \\;)*[А-яA-z]{2,8})((\\.|\\s| \\;)*)(\\d+((\\s| \\;)*[\\:\\,\\.\\-—–](\\s| \\;)*\\d+)*)(\\s| \\;)*[\\]\\)(\\;|\\.)]?/ui"; // $template = "/(\\s| \\;)?\\(?\\[?((\\s| \\;)*см\\.?\\:?(\\s| \\;)*)?(\\d?(\\s| \\;)*[А-яA-z]{2,8})((\\.|\\s| \\;)*)(\\d+((\\s| \\;)*[\\:\\,\\.\\-—–](\\s| \\;)*\\d+)*)[(\\s| \\;)\\]\\)(\\;|\\.)]?/ui"; // $template = "/(\\s| \\;)?\\(?\\[?((\\s| \\;)*см\\.?\\:?(\\s| \\;)*)?([1-4]?(\\s| \\;)*[А-яёіїєґўЁІЇЄҐЎA-z\']{2,8})((\\.|\\s| \\;)*)(\\d+((\\s| \\;)*[\\:\\,\\.\\-‐‑‒–——―](\\s| \\;)*\\d+)*)[(\\s| \\;)\\]\\)(\\;|\\.)]?/uxi"; $sps = "(?:\\s|\\x{00A0}|\\x{00C2}|(?: ))"; $dashes = "(?:[\\x{2010}-\\x{2015}]|(̴[8-9];)|(̵[0-3];))"; $template = "/(?<!\\w)((?:[1-4]|I{1,3}|IV)?" . $sps . "*['A-Za-zА-Яа-яёіїєґўЁІЇЄҐЎ]{2,8})" . $sps . "*\\.?" . $sps . "*((\\d+|[IVXLC]+)(" . $sps . "*([\\.;:,-]|" . $dashes . ")" . $sps . "*(\\d+|[IVXLC]+))*)(?!\\w)/u"; preg_match_all($template, $txt, $matches, PREG_OFFSET_CAPTURE); $cnt = count($matches[0]); $text = ""; $start = 0; $j = 0; /****************** ОТЛАДКА ****************************************/ if ($bg_bibfers_option['debug']) { $this_time = microtime(true) * 1000; $time = $this_time - $start_time; error_log(" Начальная обработка: " . round($time, 2) . " мсек.\n", 3, $debug_file); $start_time = $this_time; } /*******************************************************************/ for ($i = 0; $i < $cnt; $i++) { // Проверим по каждому паттерну. preg_match($template, $matches[0][$i][0], $mt); /****************** ОПЕРАТИВНАЯ ОТЛАДКА **************************** echo "<b>". $matches[0][$i][0]."</b> => "; $mcnt = count ($mt); for ($k=1; $k < $mcnt; $k++) { echo " <sup>|".$k."|</sup> ".$mt[$k]; } echo "<br>"; /*******************************************************************/ $cn = count($mt); if ($cn > 0) { $title = preg_replace("/" . $sps . "/u", '', $mt[1]); // Убираем пробельные символы, включая пробел, табуляцию, переводы строки $chapter = preg_replace("/" . $sps . "/u", '', $mt[2]); // и другие юникодные пробельные символы, а также неразрывные пробелы $chapter = preg_replace("/" . $dashes . "/u", '-', $chapter); // Замена разных вариантов тире на обычный $chapter = preg_replace("/;/u", ',', $chapter); // Замена точки с запятой на запятую $chapter = preg_replace("/(?<=[IVXLC]),\\./u", ":", $chapter); // Римскими цифрами обозначаются только главы (после них должно идти ":", а не "," или ".") // Замена римских цифр на арабские preg_match("/(I{1,3}|IV)(?=" . $sps . "*['A-Za-zА-Яа-яёіїєґўЁІЇЄҐЎ]{2,8})/u", $title, $rome); if ($rome) { $title = preg_replace("/" . $rome[0] . "/u", rome_to_arab($rome[0]), $title, 1); } preg_match_all("/[IVXLC]+/u", $chapter, $rome, PREG_OFFSET_CAPTURE); $crome = count($rome[0]); for ($r = 0; $r < $crome; $r++) { $chapter = preg_replace("/" . $rome[0][$r][0] . "/u", rome_to_arab($rome[0][$r][0]), $chapter, 1); } preg_match("/[\\:\\,\\.\\-]/u", $chapter, $mtchs); if ($mtchs) { if (strcasecmp($mtchs[0], ',') == 0 || strcasecmp($mtchs[0], '.') == 0) { $chapter = preg_replace("/\\,/u", ':', $chapter, 1); // Первое число всегда номер главы. Если глава отделена запятой, заменяем ее на двоеточие. $chapter = preg_replace("/\\./u", ':', $chapter, 1); // Первое число всегда номер главы. Если глава отделена точкой, заменяем ее на двоеточие. } } $title = bg_bibfers_getBook($title); if (strcasecmp($title, "") != 0 && bg_bibfers_check_tag($hdr_a, $matches[0][$i][1]) && ($bg_bibfers_option['headers'] == 'on' || bg_bibfers_check_tag($hdr_h, $matches[0][$i][1])) && bg_bibfers_check_tag($hdr_norefs, $matches[0][$i][1]) && bg_bibfers_check_tag($hdr_bible, $matches[0][$i][1])) { $ref = $matches[0][$i][0]; $ref = trim($ref, " \f\t\v\n\r��"); $book = bg_bibfers_getBook($title); // Обозначение книги if ($type == '' || $type == 'link') { $book = bg_bibfers_getshortTitle($book); // Короткое наименование книги if ($bg_bibfers_option['norm_refs']) { // Преобразовать ссылку к нормализованному виду $newmt = bg_bibfers_get_url($title, $chapter, $book . ' ' . $chapter, $lang); } else { $newmt = bg_bibfers_get_url($title, $chapter, $ref, $lang); } $listmt = bg_bibfers_get_url($title, $chapter, $book . ' ' . $chapter, $lang); $double = false; for ($k = 0; $k < $j; $k++) { // Проверяем не совпадают ли ссылки? if ($bg_bibfers_all_refs[$k] == $listmt) { $double = true; break; } } if (!$double) { // Дубликат не найден $bg_bibfers_all_refs[$j] = $listmt; $j++; } } else { $newmt = bg_bibfers_getQuotes($book, $chapter, $type, $lang, $prll); } $text = $text . substr($txt, $start, $matches[0][$i][1] - $start) . str_replace($ref, $newmt, $matches[0][$i][0]); $start = $matches[0][$i][1] + strlen($matches[0][$i][0]); } } } $txt = $text . substr($txt, $start); /****************** ОТЛАДКА ****************************************/ if ($bg_bibfers_option['debug']) { error_log(" Всего патернов : " . $i . "\n", 3, $debug_file); $this_time = microtime(true) * 1000; $time = $this_time - $start_time; error_log(" * Обработка патернов: " . round($time, 2) . " мсек.\n", 3, $debug_file); $time = $this_time - $s_time; error_log(" Полное время : " . round($time, 2) . " мсек.\n\n", 3, $debug_file); $start_time = $this_time; } /*******************************************************************/ return $txt; }
function bg_bibfers_bible_quote_refs($ref, $lang) { global $bg_bibfers_option; global $bg_bibfers_url, $bg_bibfers_bookTitle, $bg_bibfers_shortTitle, $bg_bibfers_bookFile; $lang = include_books($lang); $refs_file = $bg_bibfers_option['refs_file']; $url = dirname(dirname(__FILE__)) . '/' . $refs_file; // Локальный URL файла if (!is_file($url)) { // Если пользовательский файл не существует, то файл по умолчанию $refs_file = 'quotes.txt'; $url = dirname(dirname(__FILE__)) . '/' . $refs_file; } // Получаем данные из файла $text = false; if ($bg_bibfers_option['fgc'] == 'on' && function_exists('file_get_contents')) { // Попытка1. Если данные не получены попробуем применить file_get_contents() $text = file_get_contents($url); } if ($bg_bibfers_option['fopen'] == 'on' && !$text) { // Попытка 2. Если данные опять не получены попробуем применить fopen() $ch = fopen($url, "r"); // Открываем файл для чтения if ($ch) { while (!feof($ch)) { $text .= fread($ch, 2097152); // загрузка текста (не более 2097152 байт) } fclose($ch); // Закрываем файл } } if ($bg_bibfers_option['curl'] == 'on' && function_exists('curl_init') && !$text) { // Попытка3. Если установлен cURL $url = plugins_url($refs_file, dirname(__FILE__)); $ch = curl_init($url); // создание нового ресурса cURL curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // возврат результата передачи в качестве строки из curl_exec() вместо прямого вывода в браузер $text = curl_exec($ch); // загрузка текста $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode != '200') { $text = false; } // Проверка на код http 200 curl_close($ch); // завершение сеанса и освобождение ресурсов } if (!$text) { return ""; } // Увы. Паранойя хостера достигла апогея. Файл не прочитан или ошибка $text = trim($text); // Удаляем пробелы (или другие символы) из начала и конца текста $refs = preg_split("/\\s+/sui", $text); // Разделим текст на ссылки $cnt = count($refs); // Количество ссылок if ($ref == 'rnd') { $z = rand(0, $cnt - 1); } else { if ($ref == 'days') { $z = date('z'); // Порядковый номер дня в году if ($cnt < $z) { $z = $z % $cnt; } } else { $z = $ref - 1; // Номер записи (отсчет от нуля) if ($z < 0) { $z = 0; } else { if ($z > $cnt - 1) { $z = $cnt - 1; } } } } $ref = $refs[$z]; $ref = trim($ref); // Удаляем пробелы (или другие символы) из начала и конца строки $part = explode(".", $ref); if (isset($bg_bibfers_url[$part[0]])) { $book = $bg_bibfers_url[$part[0]]; } else { return ""; } $book = $bg_bibfers_shortTitle[$book]; if (!$book) { return ""; } // Если нет такой книги, то возвращаем пустое значение return $book . $part[1]; }