{"id":19635989,"url":"https://github.com/xiaoxiae/education-scripts","last_synced_at":"2026-03-10T14:04:05.216Z","repository":{"id":127937227,"uuid":"207364874","full_name":"xiaoxiae/Education-Scripts","owner":"xiaoxiae","description":"A collection of my education-related scripts.","archived":false,"fork":false,"pushed_at":"2025-01-15T08:20:48.000Z","size":298,"stargazers_count":6,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-06T12:31:22.415Z","etag":null,"topics":["computer-science","education","school","scripts"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xiaoxiae.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-09-09T17:24:22.000Z","updated_at":"2025-01-15T08:20:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"4dc71f9f-52ee-4221-b178-8193334f051d","html_url":"https://github.com/xiaoxiae/Education-Scripts","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xiaoxiae/Education-Scripts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoxiae%2FEducation-Scripts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoxiae%2FEducation-Scripts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoxiae%2FEducation-Scripts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoxiae%2FEducation-Scripts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xiaoxiae","download_url":"https://codeload.github.com/xiaoxiae/Education-Scripts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaoxiae%2FEducation-Scripts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30336090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T12:41:07.687Z","status":"ssl_error","status_checked_at":"2026-03-10T12:41:06.728Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["computer-science","education","school","scripts"],"created_at":"2024-11-11T12:27:54.618Z","updated_at":"2026-03-10T14:04:05.203Z","avatar_url":"https://github.com/xiaoxiae.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Education Scripts\n\n## `school`\nThe main script of the repository. Performs many school-related tasks, like opening the course folder/website, printing the calendar, listing finals, etc.\n\n### Starting out\nIf you're a student of a school that uses SIS, use `school initialize \u003cschedule CSV\u003e` to create this structure automatically (taken from `SIS -\u003e Rozvrh NG -\u003e Zobrazit všechny předměty -\u003e CSV`).\nIf not, see \"Folder Structure\" section of this document to create the structure manually.\n\n### Actions\nThe script supports various actions.\nFor example, by writing `school open course alg`, you open the course with name/abbreviation `alg`.\nHowever, since this would be quite a chore to write, you can simplify by only writing the starting letters of the actions that you want to perform (`school o c alg`, in our case).\n\nHere are the currently supported actions (the details of each are explained in the sections below).\nThe 'or' between some of the names for the actions means that either name can be used to call it, since it's tedious to remember whether to 'remove' a homework or to 'delete' it...\n\n```\nschool\n├── list\n│   ├── courses \u003cwhen\u003e\n│   ├── finals\n│   └── timeline\n│\n├── open\n│   ├── course  \u003ccourse name/abbreviation\u003e\n│   ├── website \u003ccourse name/abbreviation\u003e\n│   ├── lsf     \u003ccourse name/abbreviation\u003e\n│   ├── notes   \u003ccourse name/abbreviation\u003e\n│   └── online  \u003ccourse name/abbreviation\u003e\n│\n├── initialize \u003cschedule CSV\u003e\n│\n└── homework\n    ├── list                   \u003ccourse name/abbreviation/'all'\u003e\n    ├── add or new             \u003ccourse name/abbreviation\u003e\n    ├── edit                   \u003chomework UID\u003e\n    ├── remove or delete       \u003chomework UID\u003e\n    ├── complete or finish     \u003chomework UID\u003e\n    ├── incomplete or unfinish \u003chomework UID\u003e\n    └── extrapolate            \u003ccourse name/abbreviation\u003e\n```\n\n#### `list courses`\nLists all of the courses. The `\u003cwhen\u003e` can be either empty (listing all courses), `t`/`tm` (today/tomorrow) or `mo`/`tu`/`we`/`th`/`fr`/`sa`/`su` for listing courses on a given weekday.\n\n```\n╭───────────────────────◀ Monday / 31. 8. ▶───────────────────────╮\n│ Doporučené postupy v programování │ 10:40 - 12:10        │ SU2  │\n│ Lineární algebra 2                │ 14:00 - 15:30        │ S10  │\n│ Doporučené postupy v programování │ 15:40 - 17:10        │ S9   │\n│                                                                 │\n├───────────────────────◀ Tuesday / 1. 9. ▶───────────────────────┤\n│ Medvědovo seminář z ADS           │  9:00 - 10:30        │ S322 │\n│ Algoritmy a Datové Struktury      │ 10:40 - 12:10        │ S3   │\n│ Lineární algebra 2                │ 14:00 - 15:30        │ S5   │\n│ Počítačové systémy                │ 15:40 - 17:10        │ S3   │\n│                                                                 │\n├──────────────────────◀ Wednesday / 2. 9. ▶──────────────────────┤\n│ Programování 2                    │  9:00 - 10:30        │ S5   │\n│ The C Programming Language        │ 10:40 - 12:10        │ SU2  │\n│ Počítačové systémy                │ 12:20 - 13:50 (even) │ SW2  │\n│ Algoritmy a Datové Struktury      │ 14:00 - 15:30        │ S11  │\n│ Úvod do Linuxu                    │ 15:40 - 17:10 (even) │ S5   │\n│                                                                 │\n├───────────────────────◀ Thursday / 3. 9. ▶──────────────────────┤\n│ Architektura počítačů             │  9:00 - 10:30        │ S5   │\n│ Matematická analýza 1             │ 12:20 - 13:50        │ S1   │\n│ Matematická analýza 1             │ 14:00 - 15:30        │ S3   │\n│ Programování 2                    │ 15:40 - 17:10        │ S8   │\n│ Úvod do řešení problémů           │ 19:20 - 21:00        │ S3   │\n│                                                                 │\n├───────────────────────◀ Friday / 28. 8. ▶───────────────────────┤\n│ Úvod do Linuxu                    │ 10:40 - 12:10        │ SU2  │\n╰─────────────────────────────────────────────────────────────────╯\n```\n\nIf `\u003cwhen\u003e` is `plain`, only a simple list is produced:\n\n```\nADS++-c\nADS-c\nADS-p\nAP-p\nC-c\nDPP-c\nDPP-p\nIPS-c\nLA-c\nLA-p\nLINUX-c\nLINUX-p\nMA-c\nMA-p\nPROG-c\nPROG-p\nPS-c\nPS-p\n```\n\n#### `list finals`\nLists finals for all courses. To add a final, one must add the `final` attribute to `info.yaml`:\n\n```\n╭───────────────────────────◀ Finals! ▶───────────────────────────────────────╮\n│ Algoritmy a Datové Struktury │  4. 6. 2020 │  9:30 │ done            │ S3   │\n│ Matematická analýza 1        │  9. 6. 2020 │ 10:00 │ done            │ S5   │\n│ Programování 2               │ 10. 6. 2020 │  9:00 │ done            │ S3   │\n│ Lineární algebra 2           │ 15. 6. 2020 │  9:00 │ done            │ S9   │\n│ Architektura počítačů        │ 18. 6. 2020 │ 13:00 │ done            │ Zoom │\n│ Počítačové systémy           │ 26. 6. 2020 │ 10:00 │ 1 day, 19 hours │ Zoom │\n╰─────────────────────────────────────────────────────────────────────────────╯\n```\n\n#### `list timeline`\nLists the courses as a timeline.\n\n```\n╭──────────────────────────────────────────────────────────────────────────────────────────╮\n│7:20      9:00      10:40     12:20     14:00     15:40     17:20     19:00     20:40     │\n├──────────────────────────────────────────────────────────────────────────────────────────┤\n│                    {  DPP  }           {  LA   } {  DPP  }                               │\n│          { ADS++ } {  ADS  }           {  LA   } {  PS   }                               │\n│          { PROG  } {   C   } {  PS   } {  ADS  } { LINUX }                               │\n│          {  AP   }           {  MA   } {  MA   } { PROG  }             {   IPS  }        │\n│                    { LINUX }                                                             │\n╰──────────────────────────────────────────────────────────────────────────────────────────╯\n```\n\n#### `open \u003caction\u003e \u003ccourse\u003e`\nOpens something course-related.\n\nLeaving `course` empty selects the ongoing (or upcoming if there is no ongoing) course. One can also add `-?` at the end (where `?` is the first character of the course type) to open the specific course type inside the course folder (example: `alg-c` for \"cvičení\" (labs) in algorithms). Setting `argument` to `n` or `next` opens the next course. Note that `course` is case and diacritics-insensitive, so `open course ËĎÁüí` is the same as `open course edaui`.\n\n##### `open course \u003ccourse\u003e`\nOpen the course with the specified name/abbreviation in the file browser specified in the script configuration.\n\n##### `open website \u003ccourse\u003e`\nOpen the website of the course in the file browser specified in the configuration. If multiple websites are found, an option is presented to open one.\n\n##### `open lsf \u003ccourse\u003e`\nOpen the LSF site of the course in the file browser specified in the configuration.\n\n_Added because I'm currently getting a Master's degree in Computer Science from the University of Heidelberg and this is the central system they're using._\n\n##### `open notes \u003ccourse\u003e`\nOpen the `notes.\u003cnote app extensions\u003e` file in the given course's directory in the note app specified in the configuration.\nIf multiple files are found, an option is presented to open one.\n\n##### `open online \u003ccourse\u003e`\nOpen the course's online link in the file browser specified in the configuration.\nMeant to be a Zoom (or Zoom-like service) link, which will likely differ from the course's website.\n\n#### `initialize \u003cschedule CSV\u003e`\nInitializes a new school year from a CSV in the format from my university's information system (SIS).\nFor fellow students of MFF UK: `SIS -\u003e Rozvrh NG -\u003e Zobrazit všechny předměty -\u003e CSV`.\n\n#### `homework`\nHandles homework-related actions.\n\n##### `list \u003ccourse name/abbreviation/'all'\u003e`\nLists all unfinished homework.\n`course` is in the same form as the `open` command above.\nIf `all` is specified, all homework (regardless of completeness) is listed.\n\n```\n╭───────────────────────────────────────────────◀ Homework ▶───────────────────────────────────────────────╮\n│ iqf │ Matematická analýza 1             │ Equations     │ 27. 8. 2020 │ 12:00 │ overdue (1 day, 5 hours) │\n│ rgs │ Lineární algebra 2                │ Formulas      │ 30. 8. 2020 │ 13:00 │ 1 day, 19 hours          │\n│                                                                                                          │\n├───────────────────────────────────────────◀ Without deadline ▶───────────────────────────────────────────┤\n│ myb │ Doporučené postupy v programování │ A big project │ -           │ -     │ -                        │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n```\n\n##### `add or new \u003ccourse\u003e`\nAdd a new homework to a given course (same format as `open` above) and open it in the editor specified in `config.py`.\n\n##### `edit or change \u003cuid\u003e`\nEdit a homework with the given UID (to find a UID of a homework, use `homework list`).\n\n##### `remove or delete \u003cuid\u003e`\nDelete a homework with the given UID.\n\n##### `complete or finish \u003cuid\u003e`\nMark a homework with the given UID as compete.\n\n##### `extrapolate \u003ccourse\u003e`\nAttempt to create a new homework for a given course by looking at the name and date of the previous two.\n\n### Application dependencies\nThe script calls various external programs for opening notes/websites/folders:\n\n- File explorer: [Ranger](https://wiki.archlinux.org/index.php/Ranger)\n- Note taker: [Xournal++](https://github.com/xournalpp/xournalpp)\n- Text editor: [Vim](https://www.vim.org/)\n- Web browser: [Firefox](https://www.mozilla.org/firefox/)\n\nIf you prefer to use other programs, edit `config.py`.\n\n### Folder structure\nThe script requires a particular folder structure to function properly.\nBy default, a `courses` folder/symlink (as defined by the `courses_folder` variable in `config.py`) should be placed in the `school` folder of this repository with the following contents:\n\n```\ncourses\n├── Course 1 (abbreviation)\n│   ├── tutorial\n│   │   └── info.yaml\n│   └── lecture\n│   │   └── info.yaml\n├── Course 2 (abbreviation)\n│   ├── tutorial\n│   │   └── info.yaml\n│   └── lecture\n│   │   └── info.yaml\n└── courses...\n```\n\nThe courses should all be in one folder, their folder names being the course name, followed by the course abbreviation (`Algorithms I (ALG)`, for example).\nIn each of the course folders, at least one of the folder names specified in `school/config.py \u003e course_types` should be present - these are defined by the user and separate the given course tutorial/lecture files.\n\nThe `info.yaml` file contains all of the necessary information about the course, such as time, place, email, etc...\nHere is the full syntax with sample values:\n\n```\ncode: 14j1o53\n\nteacher:\n    name: John Smith\n    email: smith@email.com\n    website: john.com\n    office: T312\n    note: \"Consultations from 13:00 to 15:00 on Wednesday.\"\n\ntime:\n    day: Wednesday\n    start: 14:00\n    end: 15:30\n    weeks: odd\n\nclassroom:\n    address: 89 Old Atlantic St. Christiansburg, VA 24073\n    number: S11\n    floor: 3\n\nfinals:\n    date: 2020-06-18T13:00:00Z\n    classroom: ...\n\nwebsite: https://www.google.com\nonline: https://zoom.us/j/96931706150\n\ncredits: 8\n```\n\nAll of the root attributes values are optional, so even an empty `.yaml` file is a valid course identifier.\n\n### Flags\nThe script supports various flags (sometimes):\n\n- `-s`, `--short` - makes the output of the script more concise\n- `-f`, `--folder` - specify, where the current courses folder is (overrides `config.py`)\n\t- useful when you want to operate on the previous semesters but don't want to rewrite configuration\n\n## `md_to_pdf`\nConverts markdown files with embedded Xournal++ files to PDF (using Pandoc).\nHelpful when doing homework where sketches are required.\n\n### Dependencies\n\n- [Inkscape](https://inkscape.org/)\n- [Pandoc](https://pandoc.org/)\n- [Xournal++](https://github.com/xournalpp/xournalpp)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaoxiae%2Feducation-scripts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxiaoxiae%2Feducation-scripts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaoxiae%2Feducation-scripts/lists"}