├── .gitignore ├── configs ├── install.conf └── config.conf ├── editors ├── okular.sh ├── evince.sh ├── xreader.sh ├── atril.sh └── zathura.sh ├── ci-scripts ├── Dockerfile └── tests │ ├── test_ubuntu_run.sh │ └── test_install.sh ├── scripts ├── preinst.sh ├── install.sh └── run.sh ├── LICENSE ├── .github └── workflows │ └── verify.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | KORYAVNIKS/ 2 | -------------------------------------------------------------------------------- /configs/install.conf: -------------------------------------------------------------------------------- 1 | default_viewers=(okular atril evince xreader zathura) 2 | dependencies=(curl egrep sed wget) 3 | home_dir="gnu-koryavov" 4 | scipts_dir="scripts" 5 | gnukoryavov_name="gnu-koryavov" 6 | main_config=../configs/config.conf 7 | 8 | -------------------------------------------------------------------------------- /editors/okular.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -uo pipefail 3 | 4 | okular --version 2> /dev/null 5 | if [[ $? -ne 0 ]]; then 6 | 7 | echo "Okular not installed!" 8 | exit 9 | 10 | fi 11 | 12 | sem=$1 13 | str_num=$2 14 | 15 | okular -p $str_num ~/gnu-koryavov/KORYAVNIKS/${sem}.djvu 2> /dev/null 16 | -------------------------------------------------------------------------------- /editors/evince.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -uo pipefail 3 | 4 | evince --version 2> /dev/null 5 | if [[ $? -ne 0 ]]; then 6 | 7 | echo "Evince not installed!" 8 | exit 9 | 10 | fi 11 | 12 | 13 | sem=$1 14 | str_num=$2 15 | 16 | evince -i $str_num ~/gnu-koryavov/KORYAVNIKS/${sem}.djvu 2> /dev/null 17 | -------------------------------------------------------------------------------- /editors/xreader.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -uo pipefail 3 | 4 | xreader --version 2> /dev/null 5 | if [[ $? -ne 0 ]]; then 6 | 7 | echo "Xreader not installed!" 8 | exit 9 | 10 | fi 11 | 12 | sem=$1 13 | str_num=$2 14 | 15 | xreader -p $str_num ~/gnu-koryavov/KORYAVNIKS/${sem}.djvu 2> /dev/null 16 | -------------------------------------------------------------------------------- /editors/atril.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -uo pipefail 3 | 4 | atril --version 2> /dev/null 5 | if [[ $? -ne 0 ]]; then 6 | 7 | echo "Atril not installed!" 8 | exit 9 | 10 | fi 11 | 12 | sem=$1 13 | str_num=$2 14 | 15 | echo "Launching atril on page $str_num..." 16 | atril -p $str_num ~/gnu-koryavov/KORYAVNIKS/${sem}.djvu 17 | -------------------------------------------------------------------------------- /editors/zathura.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -uo pipefail 3 | 4 | check_res=$(zathura --version 2> /dev/null) 5 | if [[ $? -ne 0 || ! $check_res == *"djvu"* ]]; then 6 | 7 | echo "Zathura DjVU не установлен!" 8 | exit 9 | 10 | fi 11 | 12 | sem=$1 13 | str_num=$2 14 | 15 | zathura ~/gnu-koryavov/KORYAVNIKS/${sem}.djvu -P $str_num 2> /dev/null 16 | 17 | -------------------------------------------------------------------------------- /ci-scripts/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM ubuntu:18.04 3 | COPY gnu-koryavov /home/gnu-koryavov 4 | 5 | RUN apt update 6 | RUN apt -y install wget 7 | RUN apt -y install sudo 8 | RUN apt -y install curl 9 | RUN apt -y install atril 10 | 11 | RUN ["chmod", "+x", "/home/gnu-koryavov/ci-scripts/tests/test_install.sh"] 12 | RUN ["chmod", "+x", "/home/gnu-koryavov/ci-scripts/tests/test_ubuntu_run.sh"] 13 | 14 | 15 | -------------------------------------------------------------------------------- /scripts/preinst.sh: -------------------------------------------------------------------------------- 1 | set -uo pipefail 2 | 3 | 4 | install_config=../configs/install.conf 5 | source $install_config 6 | 7 | 8 | echo "Checking dependencies..." 9 | for utility in ${dependencies[*]}; do 10 | 11 | $utility --version &> /dev/null 12 | if [[ $? != 0 ]]; then 13 | echo "$utility is not installed!" 14 | exit 1 15 | fi 16 | 17 | done 18 | 19 | exit 0 20 | 21 | -------------------------------------------------------------------------------- /configs/config.conf: -------------------------------------------------------------------------------- 1 | #KORYAVNIKS 2 | 3 | KORYAVNIKS=( 4 | [1]=https://github.com/sin-diesel/koryavov-books/raw/master/Koryavov-VP-Metody-resheniya-zadach-v-obschem-kurse-fiziki-Mehanika.djvu 5 | [2]=https://github.com/sin-diesel/koryavov-books/raw/master/Koryavov-VP-Metody-resheniya-zadach-v-obschem-kurse-fiziki-Termodinamika-i-molekulyarnaya-fizika.djvu 6 | [3]=https://github.com/sin-diesel/koryavov-books/raw/master/Koryavov-VP-Metody-resheniya-zadach-v-obschem-kurse-fiziki-Elektrichestvo-i-magnetizm.djvu 7 | [4]=https://github.com/sin-diesel/koryavov-books/raw/master/Koryavov-VP-Metody-resheniya-zadach-v-obschem-kurse-fiziki-Optika.djvu 8 | [5]=https://github.com/sin-diesel/koryavov-books/raw/master/Koryavov-VP-Metody-resheniya-zadach-v-obschem-kurse-fiziki-Atomnaya-i-yadernaya-fizika.djvu 9 | ) 10 | 11 | #DJVUVIEWER 12 | 13 | djvuviewer_script=~/gnu-koryavov/okular.sh 14 | 15 | -------------------------------------------------------------------------------- /ci-scripts/tests/test_ubuntu_run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | # install_dir="scripts/" 5 | # workingdir="/home/gnu-koryavov" 6 | 7 | 8 | # echo "$PWD contents:" 9 | # ls -la 10 | 11 | # cd $workingdir && \ 12 | # echo "Searching $install_dir directory in $PWD..." 13 | 14 | # cd $install_dir && \ 15 | # ls -la && 16 | # echo "Running install.sh..." && 17 | # chmod +x install.sh && \ 18 | # yes | ./install.sh 19 | 20 | 21 | semester="3" 22 | task="4.23" 23 | page="134" 24 | 25 | ls -la /usr/local/bin/gnu-koryavov 26 | ls -la /root 27 | 28 | /usr/local/bin/gnu-koryavov -o -s $semester -n $task > output.tmp 29 | grep "found on page: " output.tmp 30 | output_page=$(grep "found on page: " output.tmp | sed -nr "s/.* found on page: ([[:digit:]]{1,3})!.*/\1/p") 31 | cat output.tmp 32 | 33 | if [[ $output_page != $page ]]; then 34 | echo "Run FAILED: expected page=$page, got page=$output_page" 35 | exit 1 36 | fi 37 | 38 | # Выбранная задача: 4.23 39 | # Задача 4.23 найдена на странице №134!output.tmp -------------------------------------------------------------------------------- /ci-scripts/tests/test_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | 4 | install_dir="scripts/" 5 | workingdir="/home/gnu-koryavov" 6 | 7 | 8 | echo "$PWD contents:" 9 | ls -la 10 | 11 | cd $workingdir && \ 12 | echo "Searching $install_dir directory in $PWD..." 13 | 14 | cd $install_dir && \ 15 | ls -la && 16 | echo "Running install.sh..." && 17 | chmod +x install.sh && \ 18 | yes | ./install.sh 19 | 20 | # verify if installation process is ok 21 | if [ -d "$HOME/gnu-koryavov/KORYAVNIKS" ]; then 22 | 23 | echo "KORYAVNIKS exists test: OK" 24 | 25 | else 26 | 27 | echo "KORYAVNIKS exists test: FAIL" 28 | exit 1 29 | 30 | fi 31 | 32 | if [ -f "$HOME/gnu-koryavov/config.conf" ]; then 33 | 34 | echo "config.conf exists test: OK" 35 | 36 | else 37 | 38 | echo "config.conf exists test: FAIL" 39 | exit 1 40 | 41 | fi 42 | 43 | if [ -f "/usr/local/bin/gnu-koryavov" ]; then 44 | 45 | echo "/usr/local/bin/gnu-koryavov exists test: OK" 46 | 47 | else 48 | 49 | echo "/usr/local/bin/gnu-koyravov exists test: FAIL" 50 | exit 1 51 | 52 | fi 53 | 54 | ls -la /root 55 | 56 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Stanislav Sidelnikov and Daniil Talashkevich 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /scripts/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -uo pipefail 3 | 4 | install_config=../configs/install.conf 5 | source $install_config 6 | 7 | 8 | read -p "Are you sure you want to install gnu-koryavov on your system? (Y/n): " ans 9 | if [[ $ans != "y"* && $ans != "Y"* ]]; then 10 | echo "Exiting..." 11 | exit 0 12 | fi 13 | 14 | 15 | bash ./preinst.sh 16 | 17 | echo "Installing gnu-koryavov..." 18 | mkdir -p -v $HOME/$home_dir/KORYAVNIKS 19 | sudo cp -v run.sh /usr/local/bin/$gnukoryavov_name 20 | 21 | 22 | read -p "Are you going to use one of the default document viewer scripts? (Y/n): " ans 23 | if [[ $ans == "y"* || $ans == "Y"* ]]; then 24 | 25 | cp -v ../editors/* $HOME/$home_dir/ 26 | 27 | viewer="NO VIEWER" 28 | 29 | for item in ${default_viewers[*]}; do 30 | 31 | $item --version &> /dev/null 32 | if [[ $? == 0 ]]; then 33 | viewer=$item 34 | 35 | read -p "Found $viewer installed. Do you want to stop searching? (Y/n): " ans 36 | if [[ $ans != "y"* || $ans != "Y"* ]]; then 37 | break 38 | fi 39 | fi 40 | 41 | done 42 | 43 | if [[ $viewer == "NO VIEWER" ]]; then 44 | echo "No supported DjVU viewer installed (see README for more information). Proceeding with default value" 45 | else 46 | echo "Choosen djvu viewer: $viewer. You can change it at any time (for more information see README)" 47 | sed -i "/djvuviewer_script/s/=.*\.sh/=~\/gnu-koryavov\/$viewer.sh/" $main_config 48 | fi 49 | fi 50 | 51 | 52 | cp -v $main_config $HOME/$home_dir 53 | echo "gnu-koryavov successfully installed." 54 | 55 | -------------------------------------------------------------------------------- /.github/workflows/verify.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | name: Installation and launch CI 4 | 5 | 6 | on: 7 | [ pull_request ] 8 | 9 | jobs: 10 | 11 | VerifyInstallation: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | 17 | - uses: actions/checkout@v2 18 | with: 19 | ref : ${{ github.event.pull_request.head.sha }} 20 | path: gnu-koryavov 21 | 22 | - name: Build docker image 23 | run: | 24 | echo "Creating docker image..." && 25 | cp gnu-koryavov/ci-scripts/Dockerfile . && 26 | docker build -t installation:v1.0 . -f Dockerfile 27 | 28 | - name: Run image and test installation 29 | run: | 30 | echo "Running image..." && 31 | ls gnu-koryavov/ci-scripts/tests -la && 32 | sudo docker run --entrypoint="/home/gnu-koryavov/ci-scripts/tests/test_install.sh" installation:v1.0 33 | 34 | - name: Create output artifacts directory 35 | run: | 36 | mkdir -v output/ && 37 | container=$(docker ps -a | awk 'FNR == 2 {print $1}') && 38 | sudo docker export $container > installation.tar && 39 | mv installation.tar output/ 40 | 41 | - name: Upload the docker image 42 | uses: actions/upload-artifact@v2 43 | with: 44 | name: docker_output 45 | path: | 46 | output/installation.tar 47 | 48 | VerifyUbuntuLaunch: 49 | 50 | runs-on: ubuntu-latest 51 | 52 | needs: VerifyInstallation 53 | 54 | steps: 55 | 56 | - uses: actions/checkout@v2 57 | with: 58 | ref : ${{ github.event.pull_request.head.sha }} 59 | path: gnu-koryavov 60 | 61 | - name: Download the docker image from install job 62 | uses: actions/download-artifact@v2 63 | with: 64 | name: docker_output 65 | 66 | - name: Run image and test ubuntu launch 67 | run: | 68 | docker import installation.tar installation:v1.0 && 69 | sudo docker run --entrypoint="/home/gnu-koryavov/ci-scripts/tests/test_ubuntu_run.sh" installation:v1.0 && 70 | container=$(docker ps -a | awk 'FNR == 2 {print $1}') -------------------------------------------------------------------------------- /scripts/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | open() { 5 | 6 | sem=$1 7 | str_num=$2 8 | 9 | source ~/gnu-koryavov/config.conf 10 | 11 | 12 | if [ ! -f ~/gnu-koryavov/KORYAVNIKS/${sem}.djvu ]; then 13 | download $sem 14 | fi 15 | 16 | echo "djvuviewer_script is $djvuviewer_script" 17 | ${djvuviewer_script} $sem $str_num 18 | 19 | } 20 | 21 | download() { 22 | 23 | sem=$1 24 | 25 | source ~/gnu-koryavov/config.conf 26 | 27 | cd ~/gnu-koryavov/KORYAVNIKS/ && wget -q --show-progress -O ${sem}.djvu ${KORYAVNIKS[$sem]} 28 | 29 | } 30 | 31 | help() { 32 | echo "Usage:" 33 | echo "gnu-koryavov [OPTIONS]" 34 | echo "" 35 | echo "-s Koryavnik to search into" 36 | echo "-n Task to search in Koryavnik" 37 | echo "-o Open digital Koryavnik" 38 | echo "-h Print this information and exit" 39 | } 40 | 41 | 42 | should_open="false" 43 | 44 | # get input options 45 | while getopts ":s:n:oh" opt; do 46 | case ${opt} in 47 | s) # -s 48 | arg="$OPTARG" 49 | echo "Chosen semester: $arg" 50 | sem=$arg 51 | ;; 52 | 53 | n) # -n 54 | arg="$OPTARG" 55 | echo "Chosen task: $arg" 56 | zad=$arg 57 | ;; 58 | o) # -open 59 | should_open="true" 60 | echo "Digital koryavov book will be opened." 61 | ;; 62 | \?|h) 63 | help 64 | exit 1 65 | ;; 66 | esac 67 | done 68 | 69 | # exit if no option is provided 70 | if [ "$#" -lt 2 ]; then 71 | help 72 | exit 1 73 | fi 74 | 75 | shift $((OPTIND -1)) 76 | 77 | if [[ $sem -lt 1 ]]; then 78 | echo "Specify semester number correctly!" 79 | exit 1 80 | elif (( $(echo "$zad < 1" | bc -l) )); then # compare task numer with 1 81 | echo "Specify task number correctly!" 82 | exit 1 83 | fi 84 | 85 | task_regex="[[:digit:]]+\.[[:digit:]]+" 86 | if ! [[ $zad =~ $task_regex ]]; then 87 | echo "Specify task number correctly!" 88 | exit 1 89 | fi 90 | 91 | 92 | if [ ! -f /tmp/gnu-koryavov/${sem}-${zad}.tmp ]; then 93 | 94 | mkdir -p /tmp/gnu-koryavov/ 95 | curl -s "https://mipt1.ru/1_2_3_4_5_kor.php?sem=$sem&zad=$zad" | iconv -f WINDOWS-1251 -t UTF-8 > /tmp/gnu-koryavov/${sem}-${zad}.tmp 96 | 97 | fi 98 | 99 | set +e 100 | status=$(egrep "Задача [[:digit:]]{1,2}\.[[:digit:]]{1,4} найдена" /tmp/gnu-koryavov/${sem}-${zad}.tmp) 101 | ret_code=$? 102 | set -e 103 | 104 | if [[ $ret_code -eq 0 ]]; then 105 | 106 | str_num=$(echo $status | sed -nr "s/.*на странице №([[:digit:]]{1,4})!.*/\1/p") 107 | echo "Task $zad found on page: $str_num!" 108 | 109 | if [[ $should_open == "true" ]]; then 110 | 111 | echo "Opening viewer on page $str_num." 112 | open $sem $str_num 113 | 114 | fi 115 | 116 | else 117 | echo "Task $zad not found in Koryavov :(" 118 | fi 119 | 120 | filesize=$(stat --format="%s" /tmp/gnu-koryavov/${sem}-${zad}.tmp) 121 | if [[ $filesize -eq 0 ]]; then 122 | rm /tmp/gnu-koryavov/${sem}-${zad}.tmp 123 | fi 124 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Описание утилиты 2 | 3 | gnu-koryavov - утилита командной строки Linux и MacOS, с помощью которой можно 4 | получать номер страницы для заданной задачи в Корявнике разных семестров, а также автоматически скачивать нужную версию книги и открывать её на нужной странице. 5 | 6 | 7 | # Использование 8 | 9 | После [установки](https://github.com/sin-diesel/gnu-koryavov#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0) `gnu-koryavov` может быть запущен командой вида 10 | 11 | ```shell 12 | gnu-koryavov [ОПЦИИ] 13 | ``` 14 | 15 | ## Опции 16 | 17 | - `-s <номер-семестра>` 18 | Эта опция отвечает за номер сместра. От неё будет зависет, в каком Корявнике будет идти поиск задачи 19 | - `-n <номер-задачи>` 20 | Выбор задачи. Укажите номер задачи, которую хотите найти 21 | - `-o` 22 | Открыть электронный Корявник. Задайте эту опцию, если хотите, чтобы в случае нахождения задачи в Корявнике скрипт загрузил открыл его электронную версию на нужной странице (соответственно электронный Корявник не будет открыт, если Вы не используете эту опцию) 23 | - `-h` 24 | Вывести на экран справочную информацию и выйти. 25 | 26 | ### Обязательные опции 27 | 28 | Некоторые опции являются обязательными, т.к. в случае их отсутствия скрипт не сможет однозначно интерпретировать входные данные (запуск вообще без опций в принципе не имеет смысла с практической точки зрения). Краткий список обязательных опций: 29 | 30 | - `-s` 31 | - `-n` 32 | 33 | ## Пример использования 34 | 35 | ```shell 36 | gnu-koryavov -s 1 -n 1.11 -o 37 | Выбранный семестр: 1 38 | Выбранная задача: 1.11 39 | Электронный корявник будет открыт 40 | Задача 1.11 найдена на странице №25! 41 | #вывод вспомогательной информации о скачивании и открытии электронного корявника 42 | ``` 43 | 44 | 45 | 46 | # Установка 47 | 48 | ```shell 49 | git clone https://github.com/sin-diesel/gnu-koryavov 50 | cd gnu-koryavov/scripts 51 | ./install.sh 52 | ``` 53 | 54 | # Конфигурация 55 | 56 | Для работы `gnu-koryavov` требуется указать путь к скрипту, который будет открывать Корявник на нужной странице с помощью нужной программы. 57 | 58 | ## Использование готовых скриптов 59 | 60 | Текущая версия `gnu-koryavov` уже содержит набор скриптов для открытия Корявника в следующих программах: 61 | 62 | - [Okular](https://github.com/KDE/okular) 63 | - [Atril](https://github.com/mate-desktop/atril) 64 | - [Evince](https://github.com/GNOME/evince) 65 | - [Xreader](https://github.com/linuxmint/xreader) 66 | - [Zathura](https://github.com/pwmt/zathura) 67 | 68 | Для использования одного из них нужно лишь установить путь к нему в соответствии значению `djvuviewer_script` в файле `config.conf`. 69 | Это значение по умолчанию указывает на `~/gnu-koryavov/okular.sh`, поэтому, если Вы хотите использовать Okular, согласитесь с тем, что Вы собираетесь использовать один из стандартных скриптов, при установке. 70 | 71 | ### Пример 72 | 73 | Например, если Вы хотите использовать Atril, и скрипт `atril.sh` расположен в `/home/user/gnu-koryavov/atril.sh`, измените нужный параметр `config.conf` следующим образом 74 | 75 | ```shell 76 | djvuviewer_script=/home/user/gnu-koryavov/atril.sh 77 | ``` 78 | 79 | ## Использование другого средства просмотра 80 | 81 | Вы можете создать скрипт, который будет открывать Корявник с помощью любой другой программы и настроить `gnu-koryavov` на его использование. 82 | Скрипт будет вызываться так: 83 | 84 | ```shell 85 | ./your-script <номер-семестра> <номер-страницы> 86 | ``` 87 | 88 | Скрипт должен открывать на указанной странице файл `<номер-семестра>.djvu`, расположенный в `~/gnu-koryavov/KORYAVNIKS`. 89 | 90 | Чтобы `gnu-koryavov` запускал Ваш скрипт вместо `okular.sh`, в файле `~/gnu-koryavov/config.conf` измените значение параметра `djvuviewer_script` на путь к вашему скрипту, как это сделано по умолчанию. *Не забудьте поделиться этим скриптом со всеми пользователями `gnu-koryavov`, создав соответсвующий пулл-реквест!* 91 | 92 | # Авторство и благодарности 93 | 94 | Исполнение by [Сидельников Стас](https://vk.com/sindiesel) 95 | Отдельная благодарность отдается [Талашкевичу Данику](https://vk.com/danik.princessa) за идею 96 | и помощь в создании данной тулзы. 97 | --------------------------------------------------------------------------------