From 9c7052dd4cf2717182fd1e68c22ab508aaf80aa6 Mon Sep 17 00:00:00 2001 From: Ichi Date: Sat, 9 Jan 2021 14:25:14 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE:=20+=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=B7=20Git=20=D0=BD=D0=B5=20=D0=B7=D0=B0=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B8=20+=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D1=80=D0=B0=20=D0=BF=D0=B0=D0=BF=D0=BE=D0=BA=20+?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлено: ~ исправлена ошибка в ленте Яндекс Турбо: найдены закодированные символы ~ мелкие исправления ошибок --- .gitignore | 4 +- README.md | 6 +- cPage.php | 23 --- config.inc.php | 6 +- default_config.php | 18 +++ index.php | 34 +++-- cContent.php => libs/cContent.php | 0 cDB.php => libs/cDB.php | 86 +++++++---- libs/cPage.php | 35 +++++ cPageList.php => libs/cPageList.php | 21 +-- cParse.php => libs/cParse.php | 4 +- cRSS.php => libs/cRSS.php | 8 +- libs/cUpdate.php | 141 ++++++++++++++++++ params_init.json => params/params_init.json | 0 .../params_init_page.json | 0 .../params_page_list.json | 0 .../params_page_parse.json | 0 .../params_url_parse.json | 0 rss_templates/turbo.default_params.php | 18 +++ rss_templates/turbo.rss.php | 2 +- templates/favicon.png | Bin 0 -> 42572 bytes templates/index.php | 55 +++++++ 22 files changed, 370 insertions(+), 91 deletions(-) delete mode 100644 cPage.php create mode 100644 default_config.php rename cContent.php => libs/cContent.php (100%) rename cDB.php => libs/cDB.php (76%) create mode 100644 libs/cPage.php rename cPageList.php => libs/cPageList.php (83%) rename cParse.php => libs/cParse.php (97%) rename cRSS.php => libs/cRSS.php (85%) create mode 100644 libs/cUpdate.php rename params_init.json => params/params_init.json (100%) rename params_init_page.json => params/params_init_page.json (100%) rename params_page_list.json => params/params_page_list.json (100%) rename params_page_parse.json => params/params_page_parse.json (100%) rename params_url_parse.json => params/params_url_parse.json (100%) create mode 100644 rss_templates/turbo.default_params.php create mode 100644 templates/favicon.png create mode 100644 templates/index.php diff --git a/.gitignore b/.gitignore index 58e0698..c99dfe0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ *.pdf *.psd *.sublime* -/cache.db +cache.db +config.inc.php +rss_templates/*.params.php \ No newline at end of file diff --git a/README.md b/README.md index 68d9a74..c69d34e 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ # Установка Скопировать папку в корень сайта mediawiki. После чего лучше посмотреть настройки в файлах конфигурации скрипта `config.inc.php` и ленты rss `rss_templates\turbo.params.php` _(стандартные настройки подойдут для многих)_ +Файлы с настройками создадутся автоматически при первом обращении. После чего их можно отредактировать и установить нужные параметры RSS ленты + # Вызов ленты RSS * `сайт/turbo` выведется список адресов лент rss (для Яндекс Турбо) * `сайт/turbo?page=0` лента RSS с шаблоном по умолчанию (задается в конфиге) @@ -13,8 +15,10 @@ * Не требуется авторизация к сайту. По идее может работать даже из другого места. Работает полностью через **api mediawiki** * Есть кэширование страниц, при первом запуске создается файл `cache.db`, в котором будут храниться страницы для rss лент * Можно изменить почти что угодно. Код довольно простой, параметры апи храняться в файлах `params_*.json` -* Можно добавить шаблоны, просто нужно создать три файла: `шаблон.item.php` _(один элемент ленты)_, `шаблон.rss.php` _(лента)_ и `шаблон.params.php` _(параметры ленты)_ +* Можно добавить шаблоны, просто нужно создать три файла: `шаблон.item.php` _(один элемент ленты)_, `шаблон.rss.php` _(лента)_, `шаблон.default_params.php` _(параметры ленты по умолчанию)_ и `шаблон.params.php` _(параметры ленты, создается при первом обращении к ленте)_ * Вызов шаблона (при использовании не по-умолчанию) происходит с параметром GET `template=шаблон` +* При обновлении скрипта на Git придет уведомление на e-mail, который указан в конфиге +* При обновлении скрипта, обновляет кэш (можно удалить, но тут будет больше нагрузка на сервер) # Ограничения * Ограничения самим api у mediawiki, возможно потребуется настраивать авторизацию или доступ к api diff --git a/cPage.php b/cPage.php deleted file mode 100644 index a4e8363..0000000 --- a/cPage.php +++ /dev/null @@ -1,23 +0,0 @@ -id = $id; - $this->title = $title; - $this->updateAt = $time; - } - -} \ No newline at end of file diff --git a/config.inc.php b/config.inc.php index a302804..59bd896 100644 --- a/config.inc.php +++ b/config.inc.php @@ -2,7 +2,7 @@ $server = $_SERVER['HTTP_HOST']; return [ 'defaultDate' => 1606780800, // 2020.12.01 00:00 - 'debug' => false, + 'debug' => true, 'server' => $server, 'here' => $server . $_SERVER['REQUEST_URI'], // урл API wiki @@ -12,5 +12,7 @@ // меняет авторов статей на defaultAuthor 'replaceAuthor' => false, // шаблон по-умолчанию - 'defaultTemplate' => 'turbo' + 'defaultTemplate' => 'turbo', + // электронный ящик для сообщений + 'email' => '' ]; \ No newline at end of file diff --git a/default_config.php b/default_config.php new file mode 100644 index 0000000..e4ea8cb --- /dev/null +++ b/default_config.php @@ -0,0 +1,18 @@ + 1606780800, // 2020.12.01 00:00 + 'debug' => false, + 'server' => $server, + 'here' => $server . $_SERVER['REQUEST_URI'], + // урл API wiki + 'urlAPI' => $server . "/api.php", + // если не найден автор статьи, то будет подставляться этот + 'defaultAuthor' => 'Admin', + // меняет авторов статей на defaultAuthor + 'replaceAuthor' => false, + // шаблон по-умолчанию + 'defaultTemplate' => 'turbo', + // электронный ящик для сообщений + 'email' => '' +]; \ No newline at end of file diff --git a/index.php b/index.php index 5263f37..45ff728 100644 --- a/index.php +++ b/index.php @@ -1,7 +1,13 @@ setConfigDB('init', 1); } +// проверяем версию скрипта с версией кэша +cUpdate::checkUpdate($currentVersion); +if (!empty($config['email'])) { + cUpdate::sendNotify($config['email']); +} + $list->getPages(); // проверяем все страницы - $parse->updateCache($list->listPage); $parse->fillingURL(); // модуль формирования RSS @@ -48,20 +59,11 @@ } else { // формируем список rss $countPage = ceil($list->countPageDB() / $rss->getMaxCount()); - echo "
";
-    for ($i = 0; $i < $countPage; $i++) {
-        $strTemplate = ($config['defaultTemplate'] == $rssTemplate) ? '' : "template={$rssTemplate}&";
-        echo $str = "http://{$config['here']}?{$strTemplate}page={$i}
"; - } - echo "
"; + ob_start(); + include('templates/index.php'); + $html = ob_get_contents(); + ob_end_clean(); + echo $html; } -if (!isset($_GET['page']) && $config['debug']) { - $db = new cDB(); - echo "Версия SQLite3: " . SQLite3::version()['versionString']; - echo '
';
-    echo 'Количество запросов к кэшу: '.$db::$count_query.PHP_EOL;
-    print_r($db::$query);
-    echo '
'; -} \ No newline at end of file diff --git a/cContent.php b/libs/cContent.php similarity index 100% rename from cContent.php rename to libs/cContent.php diff --git a/cDB.php b/libs/cDB.php similarity index 76% rename from cDB.php rename to libs/cDB.php index 084a466..4e5d347 100644 --- a/cDB.php +++ b/libs/cDB.php @@ -4,9 +4,11 @@ class cDB { public static SQLite3 $db; - public static $count_query; + public static int $count_query = 0; public static array $query = []; - private static $getSQL; + + public static array $config = []; + private static ?string $getSQL; public function __construct() { @@ -16,25 +18,29 @@ public function __construct() self::createTableConfig(); } - self::$getSQL = self::$getSQL ?? $this->getConfig('getSQL'); + if (empty(self::$config)) { + + $this->readConfigFromBD(); + self::$getSQL = self::$getSQL ?? $this->getConfig('getSQL'); - if (self::$getSQL == null) { - self::$getSQL = true; - try { - self::$db->enableExceptions(true); - $sql = "SELECT * FROM config WHERE name = :name;"; - $query = self::$db->prepare($sql); - $query->bindValue(':name', 'version'); - self::$query[] = (self::$getSQL) ? $query->getSQL(self::$getSQL) : "$sql version"; - $res = $query->execute()->fetchArray(SQLITE3_ASSOC); - if ($res == null) { - $this->setConfig('version', SQLite3::version()['versionString']); + if (self::$getSQL === null) { + self::$getSQL = true; + try { + self::$db->enableExceptions(true); + $sql = "SELECT * FROM config WHERE name = :name;"; + $query = self::$db->prepare($sql); + $query->bindValue(':name', 'SQLite3_version'); + self::$query[] = (self::$getSQL) ? $query->getSQL(self::$getSQL) : "$sql version"; + $res = $query->execute()->fetchArray(SQLITE3_ASSOC); + if ($res == null) { + $this->setConfig('SQLite3_version', SQLite3::version()['versionString']); + } + } catch (Exception $e) { + self::$getSQL = false; } - } catch (Exception $e) { - self::$getSQL = false; - } - $this->setConfig('getSQL', self::$getSQL); + $this->setConfig('getSQL', self::$getSQL); + } } } @@ -66,20 +72,32 @@ static function createTableConfig() return self::$db->exec($sql); } + /** + * получение параметров из БД + * @return array резульат в виде массива + */ + public function readConfigFromBD() + { + self::$count_query++; + $sql = "SELECT * FROM config "; + $query = self::$db->query($sql); + self::$query[] = $sql; + $result = []; + while ($row = $query->fetchArray(SQLITE3_ASSOC)) { + $result[$row['name']] = $row['value']; + } + self::$config = $result; + return $result; + } + /** * получение параметра из БД * @param string $name имя параметра * @return string|false строковое значение параметра или false */ - public function getConfig($name) + public function getConfig(string $name) { - self::$count_query++; - $sql = "SELECT * FROM config WHERE name = :name;"; - $query = self::$db->prepare($sql); - $query->bindValue(':name', $name); - $res = $query->execute()->fetchArray(SQLITE3_ASSOC); - self::$query[] = (self::$getSQL) ? $query->getSQL(self::$getSQL) : "$sql $name"; - return $res['value']; + return self::$config[$name]; } /** @@ -88,7 +106,7 @@ public function getConfig($name) * @param string $value значение параметра * @return bool */ - public function setConfig($name, $value) + public function setConfig(string $name, string $value) { self::$count_query++; if ($this->getConfig($name) === false || $this->getConfig($name) === null) { @@ -104,6 +122,7 @@ public function setConfig($name, $value) if (!$query->execute()) { return false; } + self::$config[$name] = $value; return true; } @@ -123,7 +142,7 @@ public function getPageByIds(array $ids) return []; } self::$count_query++; - $sql = "SELECT * FROM page WHERE id in (".implode(',', $ids).");"; + $sql = "SELECT * FROM page WHERE id in (" . implode(',', $ids) . ");"; $query = self::$db->query($sql); self::$query[] = $sql; $result = []; @@ -168,7 +187,7 @@ public function getCountPage() return $query->fetchArray(SQLITE3_ASSOC)['count']; } - public function getPageList(int $page, int $count) + public function getPageList(int $page, int $count):array { self::$count_query++; $offset = $count * $page; @@ -226,6 +245,15 @@ private function clearText($text) foreach ($templateClear as $template) { $text = preg_replace($template, '', $text); } + + $replace = [ + '[' => '[', + ']' => ']', + '<' => '<', + '>' => '>' + ]; + $text = str_replace(array_keys($replace), array_values($replace), $text); + return $text; } diff --git a/libs/cPage.php b/libs/cPage.php new file mode 100644 index 0000000..96216ff --- /dev/null +++ b/libs/cPage.php @@ -0,0 +1,35 @@ +id = $id; + $this->title = $title; + $this->updateAt = $time; + } + + + public static function convertArrayToPage(array $pageDB): cPage + { + $page = new cPage($pageDB['id'], $pageDB['title'], $pageDB['updateAt']); + $page->url = $pageDB['url']; + $page->updateAt = $pageDB ['updateAt']; + $page->categories = ($pageDB['categories'] == '') ? [] : explode(',', $pageDB['categories']); + $page->user = $pageDB['user']; + $page->text = $pageDB['text']; + $page->revid = $pageDB['revid']; + return $page; + } +} \ No newline at end of file diff --git a/cPageList.php b/libs/cPageList.php similarity index 83% rename from cPageList.php rename to libs/cPageList.php index 3dc0c0b..ae3bbce 100644 --- a/cPageList.php +++ b/libs/cPageList.php @@ -2,7 +2,7 @@ class cPageList extends cContent { - protected string $fileParams = "params_page_list.json"; + protected string $fileParams = "params/params_page_list.json"; public array $listPage = []; private string $author; private bool $replaceAuthor; @@ -23,7 +23,7 @@ public function __construct($config) public function init() { - $params = $this->initParamFile("params_init.json"); + $params = $this->initParamFile("params/params_init.json"); $pagesIndex = $this->getContentAll($params); $pages = []; foreach ($pagesIndex as $pageIndex) { @@ -71,18 +71,6 @@ public function getEmptyPages() return $this->db->getEmptyPagesId(); } - private function convertArrayToPage(array $pageDB): cPage - { - $page = new cPage($pageDB['id'], $pageDB['title'], $pageDB['updateAt']); - $page->url = $pageDB['url']; - $page->updateAt = $pageDB ['updateAt']; - $page->categories = ($pageDB['categories'] == '') ? [] : explode(',', $pageDB['categories']); - $page->user = $pageDB['user']; - $page->text = $pageDB['text']; - $page->revid = $pageDB['revid']; - return $page; - } - public function getPageId($id) { $pageDB = $this->db->getPageById($id); @@ -114,4 +102,9 @@ public function savePageDB(cPage $page) return $this->db->updateCache($page); } + private function convertArrayToPage(array $pageDB): cPage + { + return cPage::convertArrayToPage($pageDB); + } + } \ No newline at end of file diff --git a/cParse.php b/libs/cParse.php similarity index 97% rename from cParse.php rename to libs/cParse.php index 120fa36..657f151 100644 --- a/cParse.php +++ b/libs/cParse.php @@ -8,9 +8,9 @@ class cParse extends cContent public function __construct($urlAPI) { - $this->fileParams = "params_url_parse.json"; + $this->fileParams = "params/params_url_parse.json"; $this->paramsParseUrl = parent::__construct($urlAPI); - $this->fileParams = "params_page_parse.json"; + $this->fileParams = "params/params_page_parse.json"; $this->params = parent::__construct($urlAPI); $this->db = new cDB(); } diff --git a/cRSS.php b/libs/cRSS.php similarity index 85% rename from cRSS.php rename to libs/cRSS.php index 7fd443e..81af5a4 100644 --- a/cRSS.php +++ b/libs/cRSS.php @@ -13,6 +13,10 @@ public function __construct($template) $this->rss = "rss_templates/{$template}.rss.php"; $this->item = "rss_templates/{$template}.item.php"; $paramsFile = "rss_templates/{$template}.params.php"; + $defaultParamsFile = "rss_templates/{$template}.default_params.php"; + if (!file_exists($paramsFile) && !copy($defaultParamsFile, $paramsFile)) { + exit('шаблон не найден'); + } if (!file_exists($this->rss) || !file_exists($this->item) || !file_exists($paramsFile)) { exit('шаблон не найден'); } @@ -48,10 +52,10 @@ public function getMaxCount(): int /** * формирует по шаблону и переданных данных текст * @param string $part название шаблона - * @param array $data данные для шаблона + * @param array|null $data данные для шаблона * @return false|string сформированный текст */ - private function getPartTemplate($part, array $data = null) + private function getPartTemplate(string $part, array $data = null) { ob_start(); if (!empty($this->{$part})) { diff --git a/libs/cUpdate.php b/libs/cUpdate.php new file mode 100644 index 0000000..be77cd4 --- /dev/null +++ b/libs/cUpdate.php @@ -0,0 +1,141 @@ +getConfig('version'); + + if ($versionDB === null) { + self::$db->setConfig('version', $version); + } + + if (self::intVersion($versionDB) < self::intVersion($version)) { + self::update(); + // self::$db->setConfig('version', $version); + } + + self::getVersion(); + if (self::intVersion(self::$version) > self::intVersion($version)) { + self::$needUpdateFromGit = true; + } + } + + public static function sendNotify(string $mail = ''): bool + { + return mail($mail, 'Тема', 'Сообщение'); + } + + /** + * Выдает версию на Git + * @return string Версия на Git + */ + public static function getVersion(): string + { + if (empty(self::$version)) { + self::checkGitVersion(); + } + return self::$version; + } + + /** + * преобразовывает строковый параметр версии в число + * @param string|null $str + * @return int + */ + private static function intVersion(?string $str): int + { + if (!is_string($str)) { + $str = ''; + } + return (int)preg_replace('/[^\d]/m', '', $str); + } + + /** + * Проверка версии на Git, проверяет максимум раз в сутки + */ + private static function checkGitVersion() + { + if (self::$db === null) { + self::$db = new cDB(); + } + + $configGitDateCheck = self::$db->getConfig('git_date_check'); + $configGitVersion = self::$db->getConfig('git_version'); + $nextDay = $configGitDateCheck + self::periodCheck; + + if (time() < $nextDay && self::intVersion($configGitVersion) > 100) { + self::$version = $configGitVersion; + return; + } + + $url = "https://api.github.com/repos/ichinya/yandex_turbo_for_mediawiki/git/refs/tags"; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_USERAGENT, "yandex_turbo_for_mediawiki"); + $r = curl_exec($ch); + curl_close($ch); + + $response = json_decode($r, true); + $ref = $response[count($response) - 1]['ref']; + $versionGit = str_replace('refs/tags/', '', $ref); + + if (self::intVersion($versionGit) > 100) { + self::$db->setConfig('git_version', $versionGit); + self::$db->setConfig('git_date_check', time()); + self::$version = $versionGit; + } + } + + + private static function update() + { + self::update111to120(); + } + + private static function update111to120() + { + $replace = [ + '[' => '[', + ']' => ']', + '<' => '<', + '>' => '>' + ]; + + $pageCurrent = 0; + while (true) { + $pageList = self::$db->getPageList($pageCurrent, self::maxPage); + foreach ($pageList as $page) { + $oldText = $page['text']; + $page['text'] = str_replace(array_keys($replace), array_values($replace), $page['text']); + if ($oldText != $page['text']) { + echo 'find' . PHP_EOL; + self::$db->updateCache(cPage::convertArrayToPage($page)); + } + } + if (count($pageList) == 0) { + break; + } + $pageCurrent++; + } + + } + +} \ No newline at end of file diff --git a/params_init.json b/params/params_init.json similarity index 100% rename from params_init.json rename to params/params_init.json diff --git a/params_init_page.json b/params/params_init_page.json similarity index 100% rename from params_init_page.json rename to params/params_init_page.json diff --git a/params_page_list.json b/params/params_page_list.json similarity index 100% rename from params_page_list.json rename to params/params_page_list.json diff --git a/params_page_parse.json b/params/params_page_parse.json similarity index 100% rename from params_page_parse.json rename to params/params_page_parse.json diff --git a/params_url_parse.json b/params/params_url_parse.json similarity index 100% rename from params_url_parse.json rename to params/params_url_parse.json diff --git a/rss_templates/turbo.default_params.php b/rss_templates/turbo.default_params.php new file mode 100644 index 0000000..452964d --- /dev/null +++ b/rss_templates/turbo.default_params.php @@ -0,0 +1,18 @@ + 500, + // Название RSS-канала. + // Если экспортируется содержимое всего сайта, укажите название сайта. Если экспортируется раздел сайта, укажите только название раздела */ + 'title' => 'Название канала', + // Описание канала одним предложением. Не используйте HTML-разметку. + 'description' => 'Описание канала', + // Домен сайта, данные которого транслируются. + 'link' => 'http://' . $_SERVER['HTTP_HOST'], + // Блок с рубриками, который указан на основной странице сайта. + // ссылка формируется link/url + 'breadcrumblist' => [ + ['url' => '', 'text' => 'Главная'], + ['url' => 'Категория:Статьи', 'text' => 'Категории'] + ], +]; \ No newline at end of file diff --git a/rss_templates/turbo.rss.php b/rss_templates/turbo.rss.php index e664722..15e8ad5 100644 --- a/rss_templates/turbo.rss.php +++ b/rss_templates/turbo.rss.php @@ -9,7 +9,7 @@ 83615B851D9AF56F6A6EF23B51466CD0 - <?= $config['title']; ?>> + <?= $config['title']; ?> ru diff --git a/templates/favicon.png b/templates/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9918d51ace35dcb8f73872394f892ce1cf712c GIT binary patch literal 42572 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%0Aa1yK`bCKhs?ZgwS(^WTy6y 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 bmaw$;gZsu`I=6spjqNeCFu1wPCHDUTWt!f{ literal 0 HcmV?d00001 diff --git a/templates/index.php b/templates/index.php new file mode 100644 index 0000000..17ba87e --- /dev/null +++ b/templates/index.php @@ -0,0 +1,55 @@ + + + + + + + + + Яндекс Турбо для MediWiki + + +

Яндекс Турбо для MediWiki

+
версия
+ +

Список доступных лент

+
    + +
  1. + +
+ + +
Есть новая версия на GitHub, + рекомендуется обновить +
+ '; + echo 'Количество запросов к кэшу: ' . $db::$count_query . PHP_EOL; + print_r($db::$query); + echo ''; +} +?> + + + \ No newline at end of file