MadelineProto/tools/build_docs.php

213 lines
7.3 KiB
PHP
Raw Permalink Normal View History

#!/usr/bin/env php
<?php
2019-10-28 22:39:23 +01:00
/**
2020-02-17 14:13:46 +01:00
* Copyright 2016-2020 Daniil Gentili
2019-10-28 22:39:23 +01:00
* (https://daniil.it)
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*/
2019-12-14 16:47:04 +01:00
use danog\MadelineProto\API;
use danog\MadelineProto\APIFactory;
2020-06-16 17:52:55 +02:00
use danog\MadelineProto\Logger;
use danog\MadelineProto\Magic;
2019-12-14 16:47:04 +01:00
use danog\MadelineProto\MTProto;
2020-09-24 20:49:34 +02:00
use danog\MadelineProto\Settings\Logger as SettingsLogger;
2019-12-14 16:47:04 +01:00
use danog\MadelineProto\TON\API as TONAPI;
use danog\MadelineProto\TON\APIFactory as TONAPIFactory;
2019-12-27 17:43:29 +01:00
use danog\MadelineProto\TON\Lite;
2019-12-14 16:47:04 +01:00
2019-10-29 22:00:21 +01:00
\chdir($d=__DIR__.'/..');
require 'vendor/autoload.php';
2019-10-28 22:39:23 +01:00
2020-06-16 17:52:55 +02:00
Magic::classExists();
2020-09-24 20:49:34 +02:00
Logger::constructorFromSettings(new SettingsLogger);
2020-06-16 17:52:55 +02:00
$logger = Logger::$default;
2019-10-28 19:48:59 +01:00
\set_error_handler(['\danog\MadelineProto\Exception', 'ExceptionErrorHandler']);
2020-06-16 17:52:55 +02:00
$logger->logger('Merging constructor localization...', Logger::NOTICE);
mergeExtracted();
2020-06-16 17:52:55 +02:00
$logger->logger('Loading schemas...', Logger::NOTICE);
$schemas = loadSchemas();
$logger->logger('Upgrading layer...', Logger::NOTICE);
$layer = maxLayer($schemas);
layerUpgrade($layer);
2020-03-06 13:09:52 +01:00
2020-10-01 18:02:54 +02:00
$logger->logger("Initing docs (layer $layer)...", Logger::NOTICE);
$docs = [
[
2020-10-01 18:02:54 +02:00
'tl_schema' => ['mtproto' => "$d/schemas/TL_mtproto_v1.tl", 'telegram' => '', 'secret' => ''],
2017-01-02 19:52:29 +01:00
'title' => 'MadelineProto API documentation (mtproto)',
'description' => 'MadelineProto API documentation (mtproto)',
2019-10-29 22:00:21 +01:00
'output_dir' => "$d/docs/docs/MTProto_docs",
2020-06-16 17:52:55 +02:00
'template' => "$d/docs/template",
2017-01-07 12:40:51 +01:00
'readme' => false,
],
[
2020-10-01 18:02:54 +02:00
'tl_schema' => ['mtproto' => '', 'telegram' => "$d/schemas/TL_telegram_v$layer.tl", 'secret' => "$d/schemas/TL_secret.tl", 'td' => "$d/schemas/TL_td.tl"],
2020-03-06 13:09:52 +01:00
'title' => "MadelineProto API documentation (layer $layer)",
'description' => "MadelineProto API documentation (layer $layer)",
2019-10-29 22:00:21 +01:00
'output_dir' => "$d/docs/docs/API_docs",
2020-06-16 17:52:55 +02:00
'template' => "$d/docs/template",
2017-01-07 12:40:51 +01:00
'readme' => false,
],
];
2020-06-16 17:52:55 +02:00
$docs = \array_merge($docs, initDocs($schemas));
2020-06-16 17:52:55 +02:00
$logger->logger('Creating annotations...', Logger::NOTICE);
2019-12-14 16:47:04 +01:00
$doc = new \danog\MadelineProto\AnnotationsBuilder(
$logger,
$docs[1],
\dirname(__FILE__).'/../src/danog/MadelineProto/InternalDoc.php',
[
'API' => API::class,
'APIFactory' => APIFactory::class,
'MTProto' => MTProto::class
],
'danog\\MadelineProto'
);
2019-10-29 22:00:21 +01:00
$doc->mkAnnotations();
2019-12-14 16:47:04 +01:00
$doc = new \danog\MadelineProto\AnnotationsBuilder(
$logger,
2020-06-16 17:52:55 +02:00
[
'tl_schema' => [
2020-09-24 20:49:34 +02:00
'telegram' => "$d/schemas/TON/lite_api.tl",
'mtproto' => "$d/schemas/TON/ton_api.tl",
2020-06-16 17:52:55 +02:00
//'tonlib_api' => "$d/schemas/TON/tonlib_api.tl",
]
],
2019-12-14 16:47:04 +01:00
\dirname(__FILE__).'/../src/danog/MadelineProto/TON/InternalDoc.php',
[
'API' => TONAPI::class,
'APIFactory' => TONAPIFactory::class,
2019-12-27 17:43:29 +01:00
'MTProto' => Lite::class
2019-12-14 16:47:04 +01:00
],
'danog\\MadelineProto\\TON'
);
$doc->mkAnnotations();
2020-06-16 17:52:55 +02:00
$logger->logger('Creating docs...', Logger::NOTICE);
foreach ($docs as $settings) {
2018-04-19 19:56:52 +02:00
$doc = new \danog\MadelineProto\DocsBuilder($logger, $settings);
2019-10-29 22:00:21 +01:00
$doc->mkDocs();
}
2019-03-08 15:16:58 +01:00
2019-10-29 22:00:21 +01:00
\chdir(__DIR__.'/..');
2019-03-08 15:16:58 +01:00
2020-06-16 17:52:55 +02:00
$logger->logger('Fixing readme...', Logger::NOTICE);
2019-03-08 15:16:58 +01:00
$orderedfiles = [];
$order = [
'CREATING_A_CLIENT',
'LOGIN',
'FEATURES',
'REQUIREMENTS',
'INSTALLATION',
'UPDATES',
'SETTINGS',
'SELF',
'EXCEPTIONS',
'FLOOD_WAIT',
'LOGGING',
'CALLS',
'FILES',
'CHAT_INFO',
'DIALOGS',
'INLINE_BUTTONS',
'SECRET_CHATS',
'LUA',
'PROXY',
2019-12-30 20:41:06 +01:00
'ASYNC',
2019-03-08 15:16:58 +01:00
'USING_METHODS',
'CONTRIB',
2019-06-04 14:55:58 +02:00
'TEMPLATES',
2019-03-08 15:16:58 +01:00
];
$index = '';
2019-10-28 19:48:59 +01:00
$files = \glob('docs/docs/docs/*md');
2019-03-08 15:16:58 +01:00
foreach ($files as $file) {
2019-10-28 19:48:59 +01:00
$base = \basename($file, '.md');
if ($base === 'UPDATES_INTERNAL') {
continue;
}
$key = \array_search($base, $order);
2019-03-08 15:16:58 +01:00
if ($key !== false) {
$orderedfiles[$key] = $file;
}
}
2019-10-28 19:48:59 +01:00
\ksort($orderedfiles);
2019-03-08 15:16:58 +01:00
foreach ($orderedfiles as $key => $filename) {
2019-10-28 19:48:59 +01:00
$lines = \explode("\n", \file_get_contents($filename));
while (\end($lines) === '' || \strpos(\end($lines), 'Next')) {
unset($lines[\count($lines) - 1]);
2019-03-08 15:16:58 +01:00
}
if ($lines[0] === '---') {
2019-10-28 19:48:59 +01:00
\array_shift($lines);
2019-03-08 15:16:58 +01:00
while ($lines[0] !== '---') {
2019-10-28 19:48:59 +01:00
\array_shift($lines);
2019-03-08 15:16:58 +01:00
}
2019-10-28 19:48:59 +01:00
\array_shift($lines);
2019-03-08 15:16:58 +01:00
}
2019-10-28 19:48:59 +01:00
\preg_match('|^# (.*)|', $lines[0], $matches);
2019-03-08 15:16:58 +01:00
$title = $matches[1];
$description = $lines[2];
2019-10-28 19:48:59 +01:00
\array_unshift($lines, '---', 'title: '.$title, 'description: '.$description, 'image: https://docs.madelineproto.xyz/favicons/android-chrome-256x256.png', '---');
2019-03-08 15:16:58 +01:00
if (isset($orderedfiles[$key + 1])) {
2019-10-28 19:48:59 +01:00
$nextfile = 'https://docs.madelineproto.xyz/docs/'.\basename($orderedfiles[$key + 1], '.md').'.html';
$prevfile = $key === 0 ? 'https://docs.madelineproto.xyz' : 'https://docs.madelineproto.xyz/docs/'.\basename($orderedfiles[$key - 1], '.md').'.html';
$lines[\count($lines)] = "\n<a href=\"$nextfile\">Next section</a>";
2019-03-08 15:16:58 +01:00
} else {
2019-10-28 19:48:59 +01:00
$lines[\count($lines)] = "\n<a href=\"https://docs.madelineproto.xyz/#very-complex-and-complete-examples\">Next section</a>";
2019-03-08 15:16:58 +01:00
}
2019-10-28 19:48:59 +01:00
\file_put_contents($filename, \implode("\n", $lines));
2019-03-08 15:16:58 +01:00
2019-10-28 19:48:59 +01:00
$file = \file_get_contents($filename);
2019-03-08 15:16:58 +01:00
2019-10-28 19:48:59 +01:00
\preg_match_all('|( *)\* \[(.*)\]\((.*)\)|', $file, $matches);
$file = 'https://docs.madelineproto.xyz/docs/'.\basename($filename, '.md').'.html';
2019-03-08 15:16:58 +01:00
$index .= "* [$title]($file)\n";
2019-10-28 19:48:59 +01:00
if (\basename($filename) !== 'FEATURES.md') {
2019-03-08 15:16:58 +01:00
foreach ($matches[1] as $key => $match) {
$spaces = " $match";
$name = $matches[2][$key];
$url = $matches[3][$key][0] === '#' ? $file.$matches[3][$key] : $matches[3][$key];
$index .= "$spaces* [$name]($url)\n";
if ($name === 'FULL API Documentation with descriptions') {
2019-06-04 14:55:58 +02:00
$spaces .= ' ';
2019-10-28 19:48:59 +01:00
\preg_match_all('|\* (.*)|', \file_get_contents('docs/docs/API_docs/methods/index.md'), $smatches);
2019-03-08 15:16:58 +01:00
foreach ($smatches[1] as $key => $match) {
2019-10-28 19:48:59 +01:00
$match = \str_replace('href="', 'href="https://docs.madelineproto.xyz/API_docs/methods/', $match);
2019-03-08 15:16:58 +01:00
$index .= "$spaces* ".$match."\n";
}
}
}
}
}
2020-06-16 17:52:55 +02:00
$logger->logger('Fixing readme...', Logger::NOTICE);
2019-10-28 19:48:59 +01:00
$readme = \explode('## ', \file_get_contents('README.md'));
2019-03-08 15:16:58 +01:00
foreach ($readme as &$section) {
2019-10-28 19:48:59 +01:00
if (\explode("\n", $section)[0] === 'Documentation') {
2019-03-08 15:16:58 +01:00
$section = "Documentation\n\n".$index."\n";
}
}
2019-10-28 19:48:59 +01:00
$readme = \implode('## ', $readme);
2019-03-08 15:16:58 +01:00
2019-10-28 19:48:59 +01:00
\file_put_contents('README.md', $readme);
\file_put_contents('docs/docs/index.md', '---
2019-03-08 15:16:58 +01:00
title: MadelineProto documentation
description: PHP client/server for the telegram MTProto protocol (a better tg-cli)
image: https://docs.madelineproto.xyz/favicons/android-chrome-256x256.png
---
'.$readme);