Metadata-Version: 2.1
Name: nf-presentation
Version: 0.1.3
Summary: UNKNOWN
Home-page: https://github.com/thefrol/nanofootball-presentation-maker
Author: Dmitriy Frolenko
Author-email: orangefrol@gmail.com
License: MIT
Platform: UNKNOWN
Requires-Python: >3.7.0
Description-Content-Type: text/markdown; variant=GFM
Requires-Dist: python-pptx
Requires-Dist: CairoSVG
Requires-Dist: html2text

# Создатель презентаций Nanofootball

Формирует из `dict` объекта презентацию, которую можно отправить клиенту. Требует около трех секунд на одно упражнение. Таким образом создание презентации из шесть упражнения займет 10-20 секунд

# Установка

## Для Линукс систем

    pip install nf_presentation

## Для Виндоус систем

На данный момент pipwin перестал работать, так что установка кринжеватая. Но быстрая

Тут потребуется дополнительная установка библиотеки `cairocffi`, которую нужно скачать вручную с http://www.lfd.uci.edu/~gohlke/pythonlibs/#cairocffi

Выбрать под свою версию питона, например cairocffi‑1.3.0‑cp310‑cp310‑win_amd64.whl (для систем х64 и и питона 3.10(это можно узнать по записи `cp310`)) 

    pip install cairocffi‑1.3.0‑cp310‑cp310‑win_amd64.whl //или другой ваш файл
    pip install nf_presentation

Проверить можно так:

    python 

    >> import nf_presentation

Если все прошло гладко, значит ты молодец, установка прошла успешно. В противном случачае вылезет ошибка

    OSError: no library called "cairo-2" was found
    no library called "cairo" was found
    no library called "libcairo-2" was found
    cannot load library 'libcairo.so.2': error 0x7e
    cannot load library 'libcairo.2.dylib': error 0x7e
    cannot load library 'libcairo-2.dll': error 0x7e

Значит `cairocffi` все еще неправильно установлена, попробуй удалить ее `pip uninstall cairocffi` и попробуй еще раз

# Использование

    from nf_presentation import create_pptx

    pptx_bytes= create_pptx(input_data=training_data_dict)

    response=HttpResponse(pptx_bytes, content-type='application/vnd.ms-powerpoint'
    resonse['Content-Disposition']='attachement;filename="out.pptx"'
    return response

`pptx_bytes` это массив байтов, которые уже можно передать пользователям nf

## Запись в файл или поток

Для работы локально иногда может потребовать записать данные файл, для этого достаточно добавитьь аргумент `output_file`.

    import io
    from nf_presentation import create_pptx

    create_pptx(input_data=training_data_dict, output_file='out')

Теперь `create_pptx()` вернет None

## Тестовые данные

В пакет встроенны тестовые данные, и работоспособность пакета можно проверить так:

    from nf_presentation import create_from_test_data

    pptx_bytes= create_from_test_data()

    response=HttpResponse(pptx_bytes, content-type='application/vnd.ms-powerpoint'
    resonse['Content-Disposition']='attachement;filename="out.pptx"'
    return response

Для вывода во временный файл достаточно назначить аргумент `output_file` вывода во временный файл можно использовать поток, как в примере выше

    from nf_presentation import create_from_test_data
    create_from_test_data(output_file='from_test_data.pptx')


## TODO

1. [ ] Настроить логгер вместо print(..)
1. [x] ~~Устранить утечку памяти где создается поток для объектак. Используя with~~
2. [x] ~~Презентация в широком формате~~
3. [x] ~~Новое форматирование~~
4. [ ] Описание сделал читабельным
5. [ ] Капитализация значений в левой таблице
6. [ ] Размер шрифта, положение в строке
7. [ ] Форматирование в шаблоне двухконтентном
8. [ ] ~~Цвета~~
9. [ ] Cоздать презентацию для каждого упражнения, дабы отловить возможные ошибки

## Текущие проблемы

Некоторые схемы получаются искаженными, даже в упражнении из тестовых данных. Там одни из ворот почему-то вытянуты по диагонали. Слава богу, в похожей схеме из другого упражнения все нормально. Так что сравнив схемы там и там, можно решить проблему

В данный момент изображения создаются из других изображений(ворот, игроков и прочее). И эти ворота игроки скачиваются из интернета. Было бы неплохо, если бы можно было искать эти файлы локально, на сервере. Это помогло бы ускорить процесс. 

### Битый SVG

В аттрибуте shchemeData упражения хранится svg фай схемы. Можно было бы легко пользоваться этими свг, и переделать их в пнг. Но есть проблема. Эти SVG битые. 

Аттрибуты записаны некорректно. То есть с точки зрения браузера они написаны верно, а с точки зрения форматирования svg - нет. Дело в том, что для браузера не существует различий между прописными с строчными буквами, например viewBox и viewbox для браузера выглядят одинаково, но для любой программы читающей изображения(в том числе cairoSVG) viewbox без большой буквы будет считаться ошибкой и пропущен обработчиком.

Поэтому важно поправить данные полях схем, перед передачей в субпрограмму, которая из этой свг сделает PNG
> При обработке SVG данных из schemeData упражнения будут сделаны такие замены
> 1. viewbox -> viewBox
> 2. markerwidth -> markerWidth
> 3. refx -> refX
> 4. ...
> 
> Все такие замены набиваются руками и лежат в nf_presentation.settings.svg_replacements
> так же можно воспользоваться фукцией nf_presentation.settings.add_svg_replacement(old,fix), чтобы добавить новую подстановку. Потому что в дальнейшем список таких замен будет только расширяться, и если картинка на выходе не совсем походит на ту, что на сайте, скорее всего нужно поправить какой-то битый аттрибут.



### Зависимости SVG

В каждой картинке схемы из базы данных хранится ссылки на другие файлы, к счастью CairoSVG может использовать веб ссылки для картинок, чтобы создать потом png файл

> При обрботке svg схемы все ссылки /static/schemeDrawer/img/... будут заменяться на http://nanofootball.com/static/schemeDrawer/img/...
> 
> Подразумевается что все картинки доступны по адресу http://nanofootball.com/static/schemeDrawer/img/...

### Зависимости перекодировщика SVG -> PNG 

Модуль cairosvg, который собсно и перегружает картинки имеет в зависимостях cairocffi, которые на виндоус надо устанавливать отдельно, а в линуксе пока вообще хз что. Кажется это довольно грузная зависимость для сервера NF

> В данный момент подразумевается, что при установке пакета nf-presentation устанавливается CairoSVG, которая в свою очередь автоматически установит cairocffi на линкус систему. Подразумевается, что наш НФ сервер работает на линуксе

