Описание технической реализации сайта
======================================
.. raw:: html
.. image:: ../_static/sticker_lama_nothing.jpg
:scale: 30%
:align: center
:class: llama-picture
.. todo::
Данный раздел описывает техническую сторону создания и развертывания статического сайта на основе инструмента Sphinx с использованием различных расширений для улучшения
функциональности и визуализации. Сайт был разработан с учетом современных подходов к созданию документации, что обеспечивает удобство использования как для автора, так и для читателей.
1. Общая информация
-------------------
- **Инструмент генерации**: Sphinx — это мощный инструмент для создания документации и статических сайтов.
- **Тема**: Furo — современная тема для Sphinx, обеспечивающая адаптивный дизайн и удобную навигацию.
- **Размещение**: GitHub Pages — бесплатная платформа для публикации статических сайтов.
- **CI/CD pipeline**: GitHub Actions используется для автоматической сборки и деплоя сайта при каждом обновлении репозитория.
2. Используемые расширения
--------------------------
Ниже приведено описание каждого из используемых расширений:
2.1 ``sphinxcontrib.plantuml``
- Описание: Это расширение позволяет создавать UML-диаграммы, блок-схемы и другие визуальные материалы с помощью PlantUML.
- Применение: В проекте используется для демонстрации архитектурных решений и процессов (например, C4-диаграммы).
2.2 ``sphinx_tabs.tabs``
- Описание: Расширение для создания вкладок, которые позволяют показывать различные примеры кода или информацию в компактном виде.
- Применение: Используется для сравнения примеров кода на разных языках программирования или демонстрации нескольких вариантов решения одной задачи.
2.3 ``sphinx_design``
- Описание: Добавляет возможность создания карточек, баннеров и других визуальных элементов для улучшения внешнего вида документации.
- Применение: Применяется для создания привлекательных секций с информацией (например, блоговые посты или проекты).
2.4 ``sphinx.ext.githubpages``
- Описание: Это расширение добавляет поддержку файлов, необходимых для корректной работы GitHub Pages.
- Применение: Используется для публикации документации на платформе GitHub Pages.
2.5 ``jupyter_sphinx``
- Описание: Позволяет внедрять интерактивные блоки кода Jupyter Notebook прямо в документацию.
- Применение: Используется для демонстрации выполнения кода и его результатов в реальном времени.
2.6 ``sphinx_tags``
- Описание: Расширение для добавления тегов и категорий к страницам документации, что упрощает навигацию и поиск информации.
- Применение: Применяется для организации контента по тематическим группам (например, "API", "Проекты", "Блог").
2.7 ``sphinxcontrib.mermaid``
- Описание: Поддерживает создание диаграмм Mermaid внутри Sphinx, что позволяет легко добавлять графические материалы.
- Применение: Используется для отображения схем процессов, классовых диаграмм и других визуальных элементов.
2.8 ``sphinx.ext.mathjax``
- Описание: Обеспечивает поддержку математических формул через MathJax.
- Применение: Применяется для написания сложных математических выражений в документации.
2.9 ``sphinx_copybutton``
- Описание: Добавляет кнопку "Копировать" в блоки кода для удобного использования примеров.
- Применение: Упрощает работу пользователей с примерами кода, предоставляя возможность быстро скопировать их содержимое.
2.10 ``sphinx-jsonschema``
- Описание: Расширение для описания JSON Schema в документации.
- Применение: Используется для детального описания структуры запросов и ответов API.
2.11 ``sphinxcontrib.openapi``
- Описание: Поддерживает спецификацию OpenAPI для описания RESTful API.
- Применение: Применяется для создания интерактивной документации API с примерами запросов и ответов.
2.12 ``myst_parser``
- Описание: Расширение для поддержки Markdown-файлов в Sphinx.
- Применение: Позволяет использовать .md-файлы наряду с .rst для создания контента.
2.13 Собственные расширения Sphinx
2.13.1 ``sphinx.ext.autodoc``
- Описание: Автоматически генерирует документацию из комментариев в коде (docstrings).
- Применение: Не используется в данном проекте напрямую, но может быть полезно для будущих расширений.
2.13.2 ``sphinx.ext.extlinks``
- Описание: Упрощает создание ссылок на внешние ресурсы.
- Применение: Может использоваться для добавления ссылок на issues, pull requests или другие внешние источники.
2.13.3 ``sphinx.ext.intersphinx``
- Описание: Обеспечивает ссылки на документацию других проектов.
- Применение: Может быть полезно для интеграции со сторонними библиотеками или сервисами.
2.13.4 ``sphinx.ext.todo``
- Описание: Позволяет создавать заметки задач (todos) в документации.
- Применение: Используется для управления незавершенными частями документации.
2.13.5 ``sphinx.ext.viewcode``
- Описание: Добавляет возможность просмотра исходного кода для каждого объекта документации.
- Применение: Полезно для разработчиков, желающих изучить внутреннюю реализацию.
3. Структура проекта организована следующим образом
----------------------------------------------------
.. code-block::
tech_writer_portfolio/
├── source/
│ ├── index.rst # Главная страница
│ ├── projects/ # Раздел "Проекты"
│ │ ├── index.rst
│ │ ├── project_1.rst
│ │ └── project_2.rst
│ ├── skills/ # Раздел "Навыки"
│ │ └── index.rst
│ ├── blog/ # Раздел "Блог"
│ │ ├── index.rst
│ │ └── post_1.rst
│ ├── technical/ # Раздел "Техническая реализация"
│ │ └── index.rst
│ ├── resume.rst # Страница резюме
│ ├── _static/ # Папка для статических файлов (CSS, JS, изображения)
│ │ ├── custom.css
│ │ ├── print_button.js
│ │ ├── export_pdf.js
│ │ └── example_api_response.yaml # Файл OpenAPI спецификации
│ ├── _templates/ # Папка для шаблонов HTML
│ └── conf.py # Конфигурационный файл Sphinx
├── build/ # Директория для выходных файлов
├── .github/ # Настройки CI/CD через GitHub Actions
│ └── workflows/
│ └── deploy.yml # Pipeline для деплоя на GitHub Pages
├── requirements.txt # Зависимости проекта
└── Makefile # Файл для управления сборкой
4. Используемые технологии
---------------------------
4.1 Sphinx
+++++++++++
Sphinx был выбран как основной инструмент для создания сайта из-за его гибкости и возможности использовать множество расширений для добавления дополнительного функционала. Ключевые особенности:
- reStructuredText (.rst) позволяет легко создавать структурированный текст.
- Благодаря плагинам, можно добавлять диаграммы, математические формулы, блоки кода и другие элементы.
4.2 Тема Furo
++++++++++++++
Furo была выбрана за следующие преимущества:
- Адаптивный дизайн для различных устройств.
- Поддержка светлой и темной тем.
- Встроенная поддержка сворачиваемых меню и других интерактивных элементов.
4.3 Расширения Sphinx
++++++++++++++++++++++
Для расширения функциональности были использованы следующие расширения:
- ``sphinx.ext.mathjax``: Для отображения математических формул.
- ``sphinxcontrib.plantuml``: Для создания UML-диаграмм.
- ``sphinxcontrib.mermaid``: Для визуализации процессов и архитектурных решений.
- ``sphinx_togglebutton``: Для создания сворачиваемых блоков.
- ``sphinx-jsonschema``: Для описания JSON Schema в документации.
- ``sphinxcontrib.openapi``: Для работы с OpenAPI спецификацией.
5. Процесс создания
---------------------
5.1 Настройка окружения
++++++++++++++++++++++++
1) **Python**: Установлен Python 3.8+ для работы с Sphinx.
2) **Виртуальное окружение**: Создано с помощью команды ``python -m venv venv``.
3) **Зависимости**: Все зависимости указаны в файле ``requirements.txt`` и включают следующие ключевые пакеты:
.. code-block::
sphinx
furo
sphinxcontrib.plantuml
sphinx_tabs.tabs
sphinx_design
sphinx-jsonschema
sphinxcontrib.openapi
myst_parser
5.2 Инициализация проекта
++++++++++++++++++++++++++
Проект был инициализирован с помощью команды ``sphinx-quickstart``. В конфигурационном файле ``conf.py`` были добавлены необходимые расширения и настроена тема Furo:
.. code-block:: python
extensions = [
'sphinxcontrib.plantuml',
'sphinx_tabs.tabs',
'sphinx_design',
'sphinx.ext.githubpages',
'jupyter_sphinx',
'sphinx_tags',
'sphinxcontrib.mermaid',
'sphinx.ext.mathjax',
'sphinx_copybutton',
'sphinx-jsonschema',
'sphinxcontrib.openapi',
'myst_parser',
]
html_theme = 'furo'
6. Развертывание на GitHub Pages
---------------------------------
6.1 Настройка GitHub Actions
++++++++++++++++++++++++++++++
Для автоматической сборки и развертывания сайта используется GitHub Actions. Содержимое файла ``.github/workflows/deploy.yml``:
.. code-block:: yaml
name: Deploy to GitHub Pages
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Install dependencies
run: |
pip install -r requirements.txt
- name: Build Sphinx site
run: |
make html
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build/html
**Как это работает**:
1) При каждом коммите в ветку ``main`` запускается GitHub Actions workflow.
2) Workflow устанавливает зависимости, собирает сайт с помощью Sphinx (``make html``) и разворачивает результат в директории ``build/html``.
3) Содержимое ``build/html`` публикуется на GitHub Pages.
7. Особенности реализации
---------------------------
7.1 Диаграммы
++++++++++++++
Для создания диаграмм использовались PlantUML и Mermaid:
- PlantUML: Создание UML-диаграмм (например, C4-диаграммы).
- Mermaid: Создание графических схем процессов и архитектурных решений.
Пример использования PlantUML:
.. code-block:: rst
.. uml::
@startuml
Alice -> Bob: Привет
Bob --> Alice: Привет обратно
@enduml
Результат:
.. plantuml::
@startuml
Alice -> Bob: Привет
Bob --> Alice: Привет обратно
@enduml
Пример использования Mermaid:
.. code-block:: rst
.. mermaid::
graph TD
A[Клиент] --> B{API}
B -->|POST /calculate-heating| C[Сервер]
C -->|JSON Response| A
Результат:
.. mermaid::
graph TD
A[Клиент] --> B{API}
B -->|POST /calculate-heating| C[Сервер]
C -->|JSON Response| A
7.2 Резюме
+++++++++++
Страница резюме имеет следующие функции:
- **Распечатка**: Кнопка "Распечатать резюме" вызывает функцию ``window.print()`` для печати текущей страницы.
.. Готовый PDF: Предоставлена возможность скачать уже подготовленный PDF-файл, сгенерированный через Sphinx (sphinx-build -b latex).
Пример кнопок на странице резюме:
.. code-block:: rst
.. raw:: html
7.3 API Документация
+++++++++++++++++++++
Для документации API использовалось расширение ``sphinxcontrib.openapi``:
- **OpenAPI спецификация**: Хранится в файле ``example_api_response.yaml`` (или ``.json``).
- **Подключение спецификации**:
.. code-block:: rst
.. openapi:: ../_static/example_api_response.yaml
:examples:
- **JSON Schema**: Для отдельных схем запросов/ответов используется расширение ``sphinx-jsonschema``.
8. Настройка стилей
--------------------
8.1 Пользовательские CSS
+++++++++++++++++++++++++
Для кастомизации дизайна создан файл custom.css в директории ``_static/``:
.. code-block:: css
/* Стили для печати */
@media print {
.no-print, header, footer, nav, button, a {
display: none !important;
}
body {
font-family: Arial, sans-serif;
font-size: 12pt;
line-height: 1.5;
margin: 20mm;
}
}
/* Стили для кнопок */
#export-pdf, #print-button {
background-color: #007bff;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
margin-right: 10px;
}
#export-pdf {
background-color: #28a745;
}
8.2 JavaScript
++++++++++++++
Для добавления интерактивности созданы следующие скрипты:
- ``print_button.js``: Обеспечивает функционал распечатки страницы.
.. ``export_pdf.js``: Экспортирует содержимое страницы в PDF с помощью jsPDF.
Пример ``print_button.js``:
.. code-block:: javascript
document.addEventListener('DOMContentLoaded', function () {
const printButton = document.getElementById('print-button');
printButton.addEventListener('click', function () {
window.print();
});
});
9. Автоматическая генерация PDF
--------------------------------
Для создания готового PDF-файла резюме используется LaTeX через Sphinx:
1) Настройка в ``conf.py``:
.. code-block:: python
latex_documents = [
('resume', 'resume.tex', 'Резюме', 'Роман Удальцов', 'manual'),
]
2) Сборка PDF:
.. code-block:: bash
sphinx-build -b latex source build/pdf
cd build/pdf
pdflatex resume.tex
3)Скачивание PDF:
Добавлена ссылка для скачивания готового файла:
.. code-block:: rst
:download:`Скачать готовое резюме <../build/pdf/resume.pdf>`
10. CI/CD Pipeline
------------------
Pipeline для автоматической сборки и развертывания сайта настроен через GitHub Actions:
1) **Checkout кода**: Код проекта клонируется из репозитория.
2) **Установка зависимостей**: Устанавливаются все зависимости из ``requirements.txt``.
3) **Сборка сайта**: Выполняется команда ``make html`` для генерации HTML-файлов.
4) **Развертывание**: Содержимое директории ``build/html`` публикуется на GitHub Pages
10. Тестирование и отладка
--------------------------
Для тестирования и отладки использовались следующие инструменты:
- Sphinx warnings/errors: При сборке проекта проверялись предупреждения и ошибки (``make html``).
- YAML Validator: Для проверки корректности OpenAPI спецификации.
- Browser Developer Tools: Для анализа внешнего вида и поведения интерактивных элементов.