studium 0.14.16

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of studium might be problematic. Click here for more details.

Files changed (883) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2987 -0
  3. data/bin/ask_exam_question +7 -0
  4. data/bin/check_description_of_these_lectures +7 -0
  5. data/bin/curriculum_module_displayer +7 -0
  6. data/bin/cycle +7 -0
  7. data/bin/d10 +7 -0
  8. data/bin/d100 +7 -0
  9. data/bin/d15 +7 -0
  10. data/bin/d20 +7 -0
  11. data/bin/d25 +7 -0
  12. data/bin/d3 +7 -0
  13. data/bin/d30 +7 -0
  14. data/bin/d5 +7 -0
  15. data/bin/determine_curricula +7 -0
  16. data/bin/display_lecture_url +7 -0
  17. data/bin/exam_registration_at +7 -0
  18. data/bin/exam_statistics +7 -0
  19. data/bin/exams_per_month +9 -0
  20. data/bin/finished_exams_at_this_university +7 -0
  21. data/bin/flashcards +7 -0
  22. data/bin/from_curriculum_id_to_university +9 -0
  23. data/bin/location_to_this_exam_topic.rb +7 -0
  24. data/bin/mandatory_continuous_assessment +7 -0
  25. data/bin/mandatory_upcoming_courses +10 -0
  26. data/bin/n_ECTS +7 -0
  27. data/bin/n_exam_questions_already_answered +16 -0
  28. data/bin/nquestions +7 -0
  29. data/bin/nsolved +7 -0
  30. data/bin/open_last_exam_question_asked_file +7 -0
  31. data/bin/passed_exams +7 -0
  32. data/bin/passed_pr/303/274fungsimmanente_courses +7 -0
  33. data/bin/pdf_for +7 -0
  34. data/bin/random_exam_topic +7 -0
  35. data/bin/report_solved_topics +7 -0
  36. data/bin/return_n_ects_from_this_file +7 -0
  37. data/bin/search_for_n_ects +7 -0
  38. data/bin/show_lectures_on_the_commandline +7 -0
  39. data/bin/show_themes +7 -0
  40. data/bin/solved +9 -0
  41. data/bin/solved_ects +7 -0
  42. data/bin/studienkennzahl +7 -0
  43. data/bin/studium +7 -0
  44. data/bin/studium_skeleton +7 -0
  45. data/bin/ufind +7 -0
  46. data/bin/upcoming_exams +7 -0
  47. data/bin/week_parser +7 -0
  48. data/doc/ECTS_CONSIDERATIONS.md +82 -0
  49. data/doc/HOW_TO_DETERMINE_WHICH_PART_IS_THE_QUESTION_AND_WHICH_PART_IS_THE_ANSWER.md +44 -0
  50. data/doc/README.gen +2947 -0
  51. data/doc/SQL_database_specification.md +46 -0
  52. data/doc/deprecated_components.md +24 -0
  53. data/doc/documentation_for_the_file_lecture_information.md +311 -0
  54. data/doc/elegant_colours.md +21 -0
  55. data/doc/statistics/yearly_statistics.md +5 -0
  56. data/doc/todo/todo_for_the_graphical_parts_of_the_studium_gem_including_www_related_aspects.md +32 -0
  57. data/doc/todo/todo_for_the_studium_gem.md +58 -0
  58. data/img/STUDIES.png +0 -0
  59. data/lib/studium/autoinclude.rb +7 -0
  60. data/lib/studium/base/base.rb +3054 -0
  61. data/lib/studium/base/prototype.rb +592 -0
  62. data/lib/studium/c/README.md +2 -0
  63. data/lib/studium/c/a.out +0 -0
  64. data/lib/studium/c/obtain_random_entry.c +11 -0
  65. data/lib/studium/check_and_sanitize/README.md +15 -0
  66. data/lib/studium/check_and_sanitize/check_curriculum_for_correct_separation_of_bachelor_and_master.rb +141 -0
  67. data/lib/studium/check_and_sanitize/check_for_all_exam_topics_being_registered.rb +118 -0
  68. data/lib/studium/check_and_sanitize/check_for_correct_themes_of_each_course.rb +100 -0
  69. data/lib/studium/check_and_sanitize/check_for_existing_description_of_this_lecture.rb +191 -0
  70. data/lib/studium/check_and_sanitize/check_important_exams.rb +113 -0
  71. data/lib/studium/check_and_sanitize/check_the_lecture_information_file.rb +163 -0
  72. data/lib/studium/check_and_sanitize/find_duplicate_lectures.rb +124 -0
  73. data/lib/studium/check_and_sanitize/missing_priority_entry.rb +44 -0
  74. data/lib/studium/check_and_sanitize/sanitize_lecture_information.rb +428 -0
  75. data/lib/studium/check_and_sanitize/sanitize_this_string_containing_the_lva_dates.rb +79 -0
  76. data/lib/studium/colours/colours.rb +572 -0
  77. data/lib/studium/colours/sfancy.rb +46 -0
  78. data/lib/studium/colours/sfile.rb +35 -0
  79. data/lib/studium/colours/simp.rb +40 -0
  80. data/lib/studium/colours/use_colours.rb +39 -0
  81. data/lib/studium/colours/use_this_colour_for_exam_questions_and_exam_answers.rb +80 -0
  82. data/lib/studium/commandline/commandline.rb +932 -0
  83. data/lib/studium/commandline/menu.rb +906 -0
  84. data/lib/studium/constants/colours.rb +14 -0
  85. data/lib/studium/constants/constants.rb +1708 -0
  86. data/lib/studium/constants/image_constants.rb +271 -0
  87. data/lib/studium/constants/regexes.rb +44 -0
  88. data/lib/studium/constants/web_constants.rb +28 -0
  89. data/lib/studium/css/project.css +267 -0
  90. data/lib/studium/curricula/curriculum.rb +210 -0
  91. data/lib/studium/curricula/curriculum_as_string.rb +280 -0
  92. data/lib/studium/curricula/curriculum_module_displayer/constants.rb +33 -0
  93. data/lib/studium/curricula/curriculum_module_displayer/curriculum_module_displayer.rb +417 -0
  94. data/lib/studium/curricula/curriculum_module_displayer/initialize.rb +25 -0
  95. data/lib/studium/curricula/curriculum_module_displayer/menu.rb +45 -0
  96. data/lib/studium/curricula/curriculum_module_displayer/reset.rb +74 -0
  97. data/lib/studium/curricula/curriculum_module_displayer/run.rb +20 -0
  98. data/lib/studium/curricula/curriculum_module_displayer/set_use_this_curriculum.rb +93 -0
  99. data/lib/studium/curricula/curriculum_module_displayer/show_and_report.rb +190 -0
  100. data/lib/studium/curricula/determine_curricula/constants.rb +11 -0
  101. data/lib/studium/curricula/determine_curricula/determine_curricula.rb +36 -0
  102. data/lib/studium/curricula/determine_curricula/help.rb +39 -0
  103. data/lib/studium/curricula/determine_curricula/initialize.rb +48 -0
  104. data/lib/studium/curricula/determine_curricula/menu.rb +151 -0
  105. data/lib/studium/curricula/determine_curricula/misc.rb +403 -0
  106. data/lib/studium/curricula/determine_curricula/report.rb +143 -0
  107. data/lib/studium/curricula/determine_curricula/reset.rb +59 -0
  108. data/lib/studium/curricula/determine_curricula/run.rb +19 -0
  109. data/lib/studium/curricula/determine_elective_courses_in_this_curriculum.rb +112 -0
  110. data/lib/studium/curricula/display_bachelor_curricula.rb +90 -0
  111. data/lib/studium/curricula/handle_curricula/README.md +9 -0
  112. data/lib/studium/curricula/handle_curricula/handle_curricula.rb +179 -0
  113. data/lib/studium/curricula/handle_curricula/misc.rb +705 -0
  114. data/lib/studium/curricula/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.rb +323 -0
  115. data/lib/studium/curricula/modules/display_on_the_commandline.rb +319 -0
  116. data/lib/studium/curricula/modules/return_n_ects_in_this_module.rb +75 -0
  117. data/lib/studium/curricula/n_percent_solved_in_this_curriculum.rb +75 -0
  118. data/lib/studium/curricula/prepare_individual_curriculum.rb +304 -0
  119. data/lib/studium/curricula/random_curriculum_creator/random_curriculum_creator.rb +163 -0
  120. data/lib/studium/curricula/show_lectures_of_this_curriculum.rb +114 -0
  121. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/constants.rb +11 -0
  122. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/initialize.rb +27 -0
  123. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/menu.rb +35 -0
  124. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/misc.rb +264 -0
  125. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/report.rb +163 -0
  126. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/reset.rb +64 -0
  127. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/show_lectures_of_this_curriculum_id.rb +38 -0
  128. data/lib/studium/curricula/show_solved_percentage_among_the_registered_curricula.rb +87 -0
  129. data/lib/studium/curricula/sorted_individual_curricula.rb +121 -0
  130. data/lib/studium/ects/boku_ects_splitter.rb +128 -0
  131. data/lib/studium/ects/ects_per_university.rb +179 -0
  132. data/lib/studium/ects/ects_scanner.rb +141 -0
  133. data/lib/studium/ects/ects_to_university_parser.rb +142 -0
  134. data/lib/studium/ects/last_entry_is_curriculum.rb +150 -0
  135. data/lib/studium/ects/n_ects_in_these_lectures.rb +196 -0
  136. data/lib/studium/ects/n_ects_points_in_mandatory_presence_courses.rb +50 -0
  137. data/lib/studium/ects/return_n_ects_from_this_file.rb +59 -0
  138. data/lib/studium/ects/return_n_ects_from_this_url.rb +196 -0
  139. data/lib/studium/ects/search_for_n_ects.rb +614 -0
  140. data/lib/studium/ects/show_completed_ects_in_all_curricula.rb +191 -0
  141. data/lib/studium/ects/show_passed_credits_per_curriculum.rb +276 -0
  142. data/lib/studium/ects/simple_total_ects_points.rb +135 -0
  143. data/lib/studium/ects/solved_ects/constants.rb +19 -0
  144. data/lib/studium/ects/solved_ects/reset.rb +51 -0
  145. data/lib/studium/ects/solved_ects/solved_ects.rb +325 -0
  146. data/lib/studium/ects/solved_ects_per_university/reset.rb +25 -0
  147. data/lib/studium/ects/solved_ects_per_university/solved_ects_per_university.rb +106 -0
  148. data/lib/studium/ects/still_missing.rb +129 -0
  149. data/lib/studium/ects/sum_of_ects.rb +144 -0
  150. data/lib/studium/encoding/encoding.rb +108 -0
  151. data/lib/studium/exam_topics/RNAi_siRNA_and_miRNA +100 -0
  152. data/lib/studium/exam_topics/abfall_als_ressource +86 -0
  153. data/lib/studium/exam_topics/advanced_biochemistry +793 -0
  154. data/lib/studium/exam_topics/advanced_biotechnology +225 -0
  155. data/lib/studium/exam_topics/advanced_cellbiology +105 -0
  156. data/lib/studium/exam_topics/advanced_chemistry +518 -0
  157. data/lib/studium/exam_topics/advanced_microbiology +44 -0
  158. data/lib/studium/exam_topics/advanced_topics_in_plant_sciences +85 -0
  159. data/lib/studium/exam_topics/advanced_virology +229 -0
  160. data/lib/studium/exam_topics/ageing +117 -0
  161. data/lib/studium/exam_topics/agrar_ecology +63 -0
  162. data/lib/studium/exam_topics/agrarmarkt +74 -0
  163. data/lib/studium/exam_topics/agrarphysik +35 -0
  164. data/lib/studium/exam_topics/alcohols +29 -0
  165. data/lib/studium/exam_topics/algorithms +59 -0
  166. data/lib/studium/exam_topics/allergie +76 -0
  167. data/lib/studium/exam_topics/allgemeine_genetik +1006 -0
  168. data/lib/studium/exam_topics/allgemeine_mikrobiologie +977 -0
  169. data/lib/studium/exam_topics/aminoacids +447 -0
  170. data/lib/studium/exam_topics/analytische_chemie_1 +132 -0
  171. data/lib/studium/exam_topics/analytische_chemie_2 +31 -0
  172. data/lib/studium/exam_topics/anatomie +292 -0
  173. data/lib/studium/exam_topics/anorganische_chemie +323 -0
  174. data/lib/studium/exam_topics/anthropologie +117 -0
  175. data/lib/studium/exam_topics/antibodies_and_antigens +770 -0
  176. data/lib/studium/exam_topics/apoptosis +35 -0
  177. data/lib/studium/exam_topics/archaea +95 -0
  178. data/lib/studium/exam_topics/architecture +8 -0
  179. data/lib/studium/exam_topics/artificial_intelligence +85 -0
  180. data/lib/studium/exam_topics/atomemissionsspektrometrie +6 -0
  181. data/lib/studium/exam_topics/audio +11 -0
  182. data/lib/studium/exam_topics/bacteriophages +243 -0
  183. data/lib/studium/exam_topics/basic_biochemistry +1005 -0
  184. data/lib/studium/exam_topics/basic_biotechnology +1004 -0
  185. data/lib/studium/exam_topics/basic_chemistry +1007 -0
  186. data/lib/studium/exam_topics/basic_virology +1010 -0
  187. data/lib/studium/exam_topics/bauwesen +6 -0
  188. data/lib/studium/exam_topics/betriebssysteme +126 -0
  189. data/lib/studium/exam_topics/betriebswirtschaftslehre +29 -0
  190. data/lib/studium/exam_topics/bioanalytik_und_biosensoren +389 -0
  191. data/lib/studium/exam_topics/biochips +79 -0
  192. data/lib/studium/exam_topics/bioelektrochemie +57 -0
  193. data/lib/studium/exam_topics/biofilms +24 -0
  194. data/lib/studium/exam_topics/bioinformatics +507 -0
  195. data/lib/studium/exam_topics/biological_therapeutics +155 -0
  196. data/lib/studium/exam_topics/biologie +139 -0
  197. data/lib/studium/exam_topics/biomarkers +135 -0
  198. data/lib/studium/exam_topics/biomaterials +89 -0
  199. data/lib/studium/exam_topics/biomembranes +6 -0
  200. data/lib/studium/exam_topics/bionik +65 -0
  201. data/lib/studium/exam_topics/biophysik +34 -0
  202. data/lib/studium/exam_topics/biopolymers +10 -0
  203. data/lib/studium/exam_topics/bioprozesstechnik +149 -0
  204. data/lib/studium/exam_topics/bioressourcenmanagement +78 -0
  205. data/lib/studium/exam_topics/birds +3 -0
  206. data/lib/studium/exam_topics/bodenkunde +373 -0
  207. data/lib/studium/exam_topics/bodenmikrobiologie +40 -0
  208. data/lib/studium/exam_topics/cancerbiology +454 -0
  209. data/lib/studium/exam_topics/cell_cultures +221 -0
  210. data/lib/studium/exam_topics/cellbiology +1011 -0
  211. data/lib/studium/exam_topics/cellular_transport_and_protein_secretion +27 -0
  212. data/lib/studium/exam_topics/cellular_vesicles +11 -0
  213. data/lib/studium/exam_topics/cellulose +6 -0
  214. data/lib/studium/exam_topics/chemische_technologie_anorganischer_stoffe +209 -0
  215. data/lib/studium/exam_topics/chemische_technologie_organischer_stoffe +25 -0
  216. data/lib/studium/exam_topics/chemisches_labor +60 -0
  217. data/lib/studium/exam_topics/chemotaxis_quorum_sensing_and_motility_in_prokaryotes +91 -0
  218. data/lib/studium/exam_topics/citric_acid_cycle +80 -0
  219. data/lib/studium/exam_topics/clinical_microbiology +506 -0
  220. data/lib/studium/exam_topics/computer_science +284 -0
  221. data/lib/studium/exam_topics/computer_vision_and_computer_graphics +12 -0
  222. data/lib/studium/exam_topics/crispr +48 -0
  223. data/lib/studium/exam_topics/cyanobacteria +43 -0
  224. data/lib/studium/exam_topics/cytogenetics_and_chromosome_biology +570 -0
  225. data/lib/studium/exam_topics/cytokines +6 -0
  226. data/lib/studium/exam_topics/databases_and_sql +116 -0
  227. data/lib/studium/exam_topics/dna_mutation_and_dna_repair +69 -0
  228. data/lib/studium/exam_topics/dna_replication +57 -0
  229. data/lib/studium/exam_topics/ecogenetics +26 -0
  230. data/lib/studium/exam_topics/ecological_agriculture +12 -0
  231. data/lib/studium/exam_topics/ecology +317 -0
  232. data/lib/studium/exam_topics/economy +211 -0
  233. data/lib/studium/exam_topics/elektronenmikroskopie +356 -0
  234. data/lib/studium/exam_topics/elektrophorese +89 -0
  235. data/lib/studium/exam_topics/elektrotechnik_und_elektrizit/303/244t +41 -0
  236. data/lib/studium/exam_topics/elisa +54 -0
  237. data/lib/studium/exam_topics/embryologie_und_entwicklung +603 -0
  238. data/lib/studium/exam_topics/endospores_and_spores +104 -0
  239. data/lib/studium/exam_topics/enzymes_and_cofactors +353 -0
  240. data/lib/studium/exam_topics/epigenetik +184 -0
  241. data/lib/studium/exam_topics/erste_hilfe +158 -0
  242. data/lib/studium/exam_topics/ethik +138 -0
  243. data/lib/studium/exam_topics/evolution_and_evolutionary_genetics +356 -0
  244. data/lib/studium/exam_topics/excel +7 -0
  245. data/lib/studium/exam_topics/fish +19 -0
  246. data/lib/studium/exam_topics/fluorescence_microscopy +7 -0
  247. data/lib/studium/exam_topics/food_microbiology_and_food_biotechnology +83 -0
  248. data/lib/studium/exam_topics/forensik +11 -0
  249. data/lib/studium/exam_topics/forstwirtschaft +53 -0
  250. data/lib/studium/exam_topics/fortgeschrittene_genetik +576 -0
  251. data/lib/studium/exam_topics/fortgeschrittene_gentechnik +217 -0
  252. data/lib/studium/exam_topics/fortgeschrittene_physik +6 -0
  253. data/lib/studium/exam_topics/fungi +80 -0
  254. data/lib/studium/exam_topics/genetische_krankheiten +187 -0
  255. data/lib/studium/exam_topics/genexpression +1008 -0
  256. data/lib/studium/exam_topics/genomics_and_metagenomics +272 -0
  257. data/lib/studium/exam_topics/gentechnik_und_praktische_biochemie +928 -0
  258. data/lib/studium/exam_topics/geochemistry +67 -0
  259. data/lib/studium/exam_topics/geography +8 -0
  260. data/lib/studium/exam_topics/geologie_und_mineralogie +626 -0
  261. data/lib/studium/exam_topics/geometrie +54 -0
  262. data/lib/studium/exam_topics/geschichte +94 -0
  263. data/lib/studium/exam_topics/gluconeogenesis +64 -0
  264. data/lib/studium/exam_topics/glycogen +25 -0
  265. data/lib/studium/exam_topics/glycolysis +109 -0
  266. data/lib/studium/exam_topics/glykomik +101 -0
  267. data/lib/studium/exam_topics/glyoxylatzyklus +31 -0
  268. data/lib/studium/exam_topics/grassland_cultivation +32 -0
  269. data/lib/studium/exam_topics/hormone +139 -0
  270. data/lib/studium/exam_topics/html +7 -0
  271. data/lib/studium/exam_topics/human_ecology +8 -0
  272. data/lib/studium/exam_topics/hygiene +224 -0
  273. data/lib/studium/exam_topics/imaging_and_microscopy +265 -0
  274. data/lib/studium/exam_topics/immunanalytik +94 -0
  275. data/lib/studium/exam_topics/immunologie +998 -0
  276. data/lib/studium/exam_topics/informatik +103 -0
  277. data/lib/studium/exam_topics/innate_immunity +24 -0
  278. data/lib/studium/exam_topics/insekten +64 -0
  279. data/lib/studium/exam_topics/insulin_and_diabetes +57 -0
  280. data/lib/studium/exam_topics/java +597 -0
  281. data/lib/studium/exam_topics/javascript +14 -0
  282. data/lib/studium/exam_topics/klima +6 -0
  283. data/lib/studium/exam_topics/kryptographie +9 -0
  284. data/lib/studium/exam_topics/landtechnik +26 -0
  285. data/lib/studium/exam_topics/lebensmittel +222 -0
  286. data/lib/studium/exam_topics/lebensmitteltechnologie +16 -0
  287. data/lib/studium/exam_topics/linux +5 -0
  288. data/lib/studium/exam_topics/lipids +95 -0
  289. data/lib/studium/exam_topics/macroeconomics +40 -0
  290. data/lib/studium/exam_topics/marketing +7 -0
  291. data/lib/studium/exam_topics/mathematics +280 -0
  292. data/lib/studium/exam_topics/medizin_und_biomedizinische_technik +251 -0
  293. data/lib/studium/exam_topics/medizinische_chemie_und_pharmazie +416 -0
  294. data/lib/studium/exam_topics/messtechnik_und_regeltechnik +104 -0
  295. data/lib/studium/exam_topics/metabolismus +423 -0
  296. data/lib/studium/exam_topics/meteorologie_und_atmosph/303/244re +91 -0
  297. data/lib/studium/exam_topics/microbial_ecology +35 -0
  298. data/lib/studium/exam_topics/microcontrollers +11 -0
  299. data/lib/studium/exam_topics/mikrobielle_lebensgemeinschaften +33 -0
  300. data/lib/studium/exam_topics/mikrobielle_physiologie +204 -0
  301. data/lib/studium/exam_topics/mitochondria +33 -0
  302. data/lib/studium/exam_topics/mixed +286 -0
  303. data/lib/studium/exam_topics/molecular_biology_of_plants +249 -0
  304. data/lib/studium/exam_topics/molekulare_medizin +133 -0
  305. data/lib/studium/exam_topics/nanotechnologie +453 -0
  306. data/lib/studium/exam_topics/nature_conservation_and_biodiversity +211 -0
  307. data/lib/studium/exam_topics/naturstoffe +9 -0
  308. data/lib/studium/exam_topics/netzwerke +34 -0
  309. data/lib/studium/exam_topics/neurobiology +272 -0
  310. data/lib/studium/exam_topics/nucleotide_sequencing +38 -0
  311. data/lib/studium/exam_topics/nutztierethologie +11 -0
  312. data/lib/studium/exam_topics/object_oriented_modeling +14 -0
  313. data/lib/studium/exam_topics/obstbau +249 -0
  314. data/lib/studium/exam_topics/organische_chemie +1007 -0
  315. data/lib/studium/exam_topics/organische_chemie_2 +125 -0
  316. data/lib/studium/exam_topics/paleobiology +39 -0
  317. data/lib/studium/exam_topics/parasitic_diseases_and_molecular_infection_biology +336 -0
  318. data/lib/studium/exam_topics/patent_law +55 -0
  319. data/lib/studium/exam_topics/pathologie +723 -0
  320. data/lib/studium/exam_topics/pcr +152 -0
  321. data/lib/studium/exam_topics/pentosephosphatweg +41 -0
  322. data/lib/studium/exam_topics/peroxisomes_glycosomes_and_lysosomes +66 -0
  323. data/lib/studium/exam_topics/pflanzenanatomie +255 -0
  324. data/lib/studium/exam_topics/pflanzenbau +24 -0
  325. data/lib/studium/exam_topics/pflanzenschutz +35 -0
  326. data/lib/studium/exam_topics/pflanzenwissenschaften +1009 -0
  327. data/lib/studium/exam_topics/pharmaceutical_biotechnology +251 -0
  328. data/lib/studium/exam_topics/physik +443 -1
  329. data/lib/studium/exam_topics/physikalische_chemie +86 -0
  330. data/lib/studium/exam_topics/physiology_and_histology +520 -0
  331. data/lib/studium/exam_topics/phytochemie +33 -0
  332. data/lib/studium/exam_topics/plant_biotechnology +129 -0
  333. data/lib/studium/exam_topics/plant_breeding +64 -0
  334. data/lib/studium/exam_topics/plant_development +50 -0
  335. data/lib/studium/exam_topics/populationsgenetik +137 -0
  336. data/lib/studium/exam_topics/posttranslationale_modifikation_von_proteinen +195 -0
  337. data/lib/studium/exam_topics/projektmanagement +220 -0
  338. data/lib/studium/exam_topics/prokaryote_genetics +547 -0
  339. data/lib/studium/exam_topics/protein_engineering +16 -0
  340. data/lib/studium/exam_topics/proteolyse +36 -0
  341. data/lib/studium/exam_topics/proteomik +40 -0
  342. data/lib/studium/exam_topics/prozesstechnik +95 -0
  343. data/lib/studium/exam_topics/psychologie +14 -0
  344. data/lib/studium/exam_topics/python +355 -0
  345. data/lib/studium/exam_topics/quality_management +263 -0
  346. data/lib/studium/exam_topics/rechtsgrundlagen +116 -0
  347. data/lib/studium/exam_topics/research_topics_in_immunobiology +42 -0
  348. data/lib/studium/exam_topics/rna_and_dna +457 -0
  349. data/lib/studium/exam_topics/rna_seq +11 -0
  350. data/lib/studium/exam_topics/robotik +6 -0
  351. data/lib/studium/exam_topics/ruby +183 -0
  352. data/lib/studium/exam_topics/ruby_on_rails +63 -0
  353. data/lib/studium/exam_topics/scientific_writing_and_publishing +38 -0
  354. data/lib/studium/exam_topics/semisynthese_von_proteinen_und_nukleotiden +120 -0
  355. data/lib/studium/exam_topics/sexualbiologie +108 -0
  356. data/lib/studium/exam_topics/signal_transduction_and_laser_systems +197 -0
  357. data/lib/studium/exam_topics/splicing_exons_and_introns +63 -0
  358. data/lib/studium/exam_topics/statistik +241 -0
  359. data/lib/studium/exam_topics/stemcells +159 -0
  360. data/lib/studium/exam_topics/stickstofffixierung +76 -0
  361. data/lib/studium/exam_topics/structural_bioinformatics +54 -0
  362. data/lib/studium/exam_topics/strukturbiologie +387 -0
  363. data/lib/studium/exam_topics/system_biology_and_synthetic_biology +103 -0
  364. data/lib/studium/exam_topics/systematische_zoologie +436 -0
  365. data/lib/studium/exam_topics/technical_ecology +144 -0
  366. data/lib/studium/exam_topics/technische_chemie +204 -0
  367. data/lib/studium/exam_topics/technische_grundlagen_der_informatik +39 -0
  368. data/lib/studium/exam_topics/technische_mikrobiologie +393 -0
  369. data/lib/studium/exam_topics/technisches_zeichnen +5 -0
  370. data/lib/studium/exam_topics/the_bacterial_cell_wall +97 -0
  371. data/lib/studium/exam_topics/the_c_plus_plus_programming_language +491 -0
  372. data/lib/studium/exam_topics/the_c_programming_language +129 -0
  373. data/lib/studium/exam_topics/the_cellcycle +89 -0
  374. data/lib/studium/exam_topics/the_european_union +119 -0
  375. data/lib/studium/exam_topics/the_interferon_system +39 -0
  376. data/lib/studium/exam_topics/the_microbiome +164 -0
  377. data/lib/studium/exam_topics/the_universe +26 -0
  378. data/lib/studium/exam_topics/theoretische_chemie +5 -0
  379. data/lib/studium/exam_topics/theoretische_informatik +157 -0
  380. data/lib/studium/exam_topics/thermodynamics +3 -0
  381. data/lib/studium/exam_topics/tierzucht +139 -0
  382. data/lib/studium/exam_topics/toxikologie +447 -0
  383. data/lib/studium/exam_topics/transcription +164 -0
  384. data/lib/studium/exam_topics/translation_ribosomes_and_translational_control +144 -0
  385. data/lib/studium/exam_topics/umweltbiotechnologie +64 -0
  386. data/lib/studium/exam_topics/umweltchemie +233 -0
  387. data/lib/studium/exam_topics/urbanism_and_traffic +19 -0
  388. data/lib/studium/exam_topics/urea_cycle +55 -0
  389. data/lib/studium/exam_topics/vaccines_and_vaccination +246 -0
  390. data/lib/studium/exam_topics/vectors_and_gene_therapy +246 -0
  391. data/lib/studium/exam_topics/verfahrenstechnik +37 -0
  392. data/lib/studium/exam_topics/veterinary_medicine +10 -0
  393. data/lib/studium/exam_topics/vitamine +25 -0
  394. data/lib/studium/exam_topics/wasserkunde +137 -0
  395. data/lib/studium/exam_topics/weinbau +82 -0
  396. data/lib/studium/exam_topics/wissenschaft +18 -0
  397. data/lib/studium/exam_topics/yeast +102 -0
  398. data/lib/studium/exam_topics/zoologie +333 -0
  399. data/lib/studium/exams/afterburn/afterburn.rb +257 -0
  400. data/lib/studium/exams/ask_exam_from_the_upcoming_exams_pool.rb +150 -0
  401. data/lib/studium/exams/ask_exam_topic_question.rb +112 -0
  402. data/lib/studium/exams/ask_question_from_alias.rb +141 -0
  403. data/lib/studium/exams/ask_question_from_any_of_the_still_missing_lectures.rb +131 -0
  404. data/lib/studium/exams/ask_question_from_grouped_themes.rb +141 -0
  405. data/lib/studium/exams/ask_question_from_last_topic.rb +91 -0
  406. data/lib/studium/exams/ask_random_question.rb +195 -0
  407. data/lib/studium/exams/autoinclude.rb +7 -0
  408. data/lib/studium/exams/average_grade.rb +396 -0
  409. data/lib/studium/exams/csv/create_csv_passed_exams_file.rb +217 -0
  410. data/lib/studium/exams/cycle.rb +291 -0
  411. data/lib/studium/exams/dataset.rb +124 -0
  412. data/lib/studium/exams/designate_ten_random_exam_topics/designate_ten_random_exam_topics.rb +88 -0
  413. data/lib/studium/exams/exam/exam.rb +130 -0
  414. data/lib/studium/exams/exam_question/README.md +3 -0
  415. data/lib/studium/exams/exam_question/answer.rb +193 -0
  416. data/lib/studium/exams/exam_question/constants.rb +111 -0
  417. data/lib/studium/exams/exam_question/exam_question.rb +1136 -0
  418. data/lib/studium/exams/exam_question/menu.rb +333 -0
  419. data/lib/studium/exams/exam_question/misc.rb +898 -0
  420. data/lib/studium/exams/exam_question/question.rb +91 -0
  421. data/lib/studium/exams/exam_question/reset.rb +96 -0
  422. data/lib/studium/exams/exam_registration_at/constants.rb +49 -0
  423. data/lib/studium/exams/exam_registration_at/exam_registration_at.rb +242 -0
  424. data/lib/studium/exams/exam_registration_at/help.rb +46 -0
  425. data/lib/studium/exams/exam_registration_at/menu.rb +81 -0
  426. data/lib/studium/exams/exam_registration_at/report_and_show.rb +133 -0
  427. data/lib/studium/exams/exam_registration_at/reset.rb +54 -0
  428. data/lib/studium/exams/exam_statistics_from_this_file/exam_statistics_from_this_file.rb +119 -0
  429. data/lib/studium/exams/exam_topics.rb +194 -0
  430. data/lib/studium/exams/exams.rb +20 -0
  431. data/lib/studium/exams/exams_per_month/exams_per_month.rb +2438 -0
  432. data/lib/studium/exams/exams_this_week.rb +182 -0
  433. data/lib/studium/exams/fix_exam_dates.rb +121 -0
  434. data/lib/studium/exams/frozen.rb +36 -0
  435. data/lib/studium/exams/last_exams/last_exams.rb +398 -0
  436. data/lib/studium/exams/lectures_without_exam_entry.rb +137 -0
  437. data/lib/studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb +1359 -0
  438. data/lib/studium/exams/move_the_last_exam_question_to_the_top_of_the_file/move_the_last_exam_question_to_the_top_of_the_file.rb +111 -0
  439. data/lib/studium/exams/n_exams_in_these_topics.rb +404 -0
  440. data/lib/studium/exams/next_exam.rb +107 -0
  441. data/lib/studium/exams/next_exams.rb +378 -0
  442. data/lib/studium/exams/open_exam_associated_url.rb +154 -0
  443. data/lib/studium/exams/open_last_exam_question_asked_file/constants.rb +15 -0
  444. data/lib/studium/exams/open_last_exam_question_asked_file/initialize.rb +29 -0
  445. data/lib/studium/exams/open_last_exam_question_asked_file/open_last_exam_question_asked_file.rb +109 -0
  446. data/lib/studium/exams/push_solved_questions_on_top.rb +180 -0
  447. data/lib/studium/exams/questions_solved_from_day_to_day/questions_solved_from_day_to_day.rb +377 -0
  448. data/lib/studium/exams/remote_ftp_url.rb +52 -0
  449. data/lib/studium/exams/repeat_last_question.rb +78 -0
  450. data/lib/studium/exams/show_all_passed_exams_of_this_university.rb +252 -0
  451. data/lib/studium/exams/show_backlog_of_exams.rb +117 -0
  452. data/lib/studium/exams/show_next_exams_for.rb +133 -0
  453. data/lib/studium/exams/show_themes/constants.rb +28 -0
  454. data/lib/studium/exams/show_themes/menu.rb +61 -0
  455. data/lib/studium/exams/show_themes/misc.rb +537 -0
  456. data/lib/studium/exams/show_themes/reset.rb +62 -0
  457. data/lib/studium/exams/show_themes/show_themes.rb +27 -0
  458. data/lib/studium/exams/show_upcoming_exams/show_upcoming_exams.rb +1146 -0
  459. data/lib/studium/exams/solve_all_questions_from_this_topic.rb +114 -0
  460. data/lib/studium/exams/solved/constants.rb +32 -0
  461. data/lib/studium/exams/solved/help.rb +24 -0
  462. data/lib/studium/exams/solved/initialize.rb +55 -0
  463. data/lib/studium/exams/solved/menu.rb +41 -0
  464. data/lib/studium/exams/solved/reset.rb +28 -0
  465. data/lib/studium/exams/solved/solved.rb +317 -0
  466. data/lib/studium/exams/timetable/timetable.rb +510 -0
  467. data/lib/studium/exams/unsolve_all_questions_from_this_topic.rb +162 -0
  468. data/lib/studium/exams/upcoming_exams/upcoming_exams.rb +556 -0
  469. data/lib/studium/exams/upcoming_exams_at_the_boku/constants.rb +23 -0
  470. data/lib/studium/exams/upcoming_exams_at_the_boku/html.rb +64 -0
  471. data/lib/studium/exams/upcoming_exams_at_the_boku/upcoming_exams_at_the_boku.rb +194 -0
  472. data/lib/studium/exams/upcoming_exams_dataset.rb +247 -0
  473. data/lib/studium/exams/upcoming_registered_exams/upcoming_registered_exams.rb +257 -0
  474. data/lib/studium/exams/upload_exam_topics.rb +360 -0
  475. data/lib/studium/graphviz/README.md +4 -0
  476. data/lib/studium/graphviz/bachelor_vector_based_strategies.dot +160 -0
  477. data/lib/studium/graphviz/master_vector_based_strategies.dot +46 -0
  478. data/lib/studium/gui/gtk3/README.md +1 -0
  479. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.config +6 -0
  480. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.rb +760 -0
  481. data/lib/studium/gui/gtk3/ask_exam_question/manifest.yml +12 -0
  482. data/lib/studium/gui/gtk3/control_panel/control_panel.rb +39 -0
  483. data/lib/studium/gui/gtk3/curriculum_viewer/curriculum_viewer.rb +510 -0
  484. data/lib/studium/gui/gtk3/ects_per_university/ects_per_university.rb +217 -0
  485. data/lib/studium/gui/gtk3/exam_question_widget/exam_question_widget.rb +1888 -0
  486. data/lib/studium/gui/gtk3/expand_time_range/expand_time_range.rb +34 -0
  487. data/lib/studium/gui/gtk3/information_about_a_lecture/information_about_a_lecture.rb +34 -0
  488. data/lib/studium/gui/gtk3/lecture_information/lecture_information.rb +200 -0
  489. data/lib/studium/gui/gtk3/show_upcoming_exams/show_upcoming_exams.rb +34 -0
  490. data/lib/studium/gui/java/exam_question/ExamQuestion$1.class +0 -0
  491. data/lib/studium/gui/java/exam_question/ExamQuestion.class +0 -0
  492. data/lib/studium/gui/java/exam_question/ExamQuestion.java +215 -0
  493. data/lib/studium/gui/javafx/exam_question_widget/exam_question_widget.rb +58 -0
  494. data/lib/studium/gui/jruby/exam_question_widget/exam_question_widget.rb +317 -0
  495. data/lib/studium/gui/libui/ask_exam_question/ask_exam_question.rb +349 -0
  496. data/lib/studium/gui/shared_code/control_panel/control_panel_module.rb +314 -0
  497. data/lib/studium/gui/shared_code/exam_question_widget/exam_question_widget_module.rb +39 -0
  498. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range.css +0 -0
  499. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range_module.rb +190 -0
  500. data/lib/studium/gui/shared_code/information_about_a_lecture/information_about_a_lecture_module.rb +180 -0
  501. data/lib/studium/gui/shared_code/show_upcoming_exams/show_upcoming_exams_module.rb +206 -0
  502. data/lib/studium/images/libui_ask_exam_question.png +0 -0
  503. data/lib/studium/images/outdated.png +0 -0
  504. data/lib/studium/images/small_logos/DNA.png +0 -0
  505. data/lib/studium/images/small_logos/README.md +2 -0
  506. data/lib/studium/images/small_logos/solved.png +0 -0
  507. data/lib/studium/images/studies_favicon.png +0 -0
  508. data/lib/studium/java/Mkdir.java +15 -0
  509. data/lib/studium/java/README.md +2 -0
  510. data/lib/studium/java/ask_exam_question/AskExamQuestion.class +0 -0
  511. data/lib/studium/java/ask_exam_question/AskExamQuestion.java +480 -0
  512. data/lib/studium/java/constants/Constants.class +0 -0
  513. data/lib/studium/java/constants/Constants.java +77 -0
  514. data/lib/studium/java/solved/Solved.class +0 -0
  515. data/lib/studium/java/solved/Solved.java +110 -0
  516. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.class +0 -0
  517. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.java +80 -0
  518. data/lib/studium/logging/README.md +2 -0
  519. data/lib/studium/logging/ensure_that_the_log_directory_exists.rb +47 -0
  520. data/lib/studium/logging/html_log_directory.rb +41 -0
  521. data/lib/studium/logging/log_directory.rb +112 -0
  522. data/lib/studium/logging/store_last_question_asked_into_file.rb +137 -0
  523. data/lib/studium/parsers/README.md +2 -0
  524. data/lib/studium/parsers/custom_exam_results_parser.rb +206 -0
  525. data/lib/studium/parsers/parse_lva_dates.rb +233 -0
  526. data/lib/studium/parsers/parse_remote_lecture.rb +331 -0
  527. data/lib/studium/project/project.rb +76 -0
  528. data/lib/studium/requires/common_popular_requires.rb +37 -0
  529. data/lib/studium/requires/commonly_used_requires.rb +14 -0
  530. data/lib/studium/requires/require_class_exams_solved.rb +7 -0
  531. data/lib/studium/requires/require_ects_scripts.rb +27 -0
  532. data/lib/studium/requires/require_encoding.rb +7 -0
  533. data/lib/studium/requires/require_the_check_and_sanitize_files.rb +31 -0
  534. data/lib/studium/requires/require_the_curricula_files.rb +28 -0
  535. data/lib/studium/requires/require_the_exam_question_class.rb +7 -0
  536. data/lib/studium/requires/require_the_exams_files.rb +45 -0
  537. data/lib/studium/requires/require_the_logging_files.rb +23 -0
  538. data/lib/studium/requires/require_the_parsers.rb +28 -0
  539. data/lib/studium/requires/require_the_studium_constants.rb +10 -0
  540. data/lib/studium/requires/require_the_studium_project.rb +60 -0
  541. data/lib/studium/requires/require_the_toplevel_methods.rb +27 -0
  542. data/lib/studium/requires/require_the_utility_scripts.rb +49 -0
  543. data/lib/studium/requires/require_upcoming_exams.rb +7 -0
  544. data/lib/studium/requires/require_yaml.rb +7 -0
  545. data/lib/studium/requires/return_remote_homepage_of_this_lecture.rb +7 -0
  546. data/lib/studium/requires/with_GUI.rb +13 -0
  547. data/lib/studium/requires/www_mode.rb +17 -0
  548. data/lib/studium/statistics/README.md +4 -0
  549. data/lib/studium/statistics/best_exam_months.rb +92 -0
  550. data/lib/studium/statistics/curriculum_comparer.rb +337 -0
  551. data/lib/studium/statistics/determine_exam_statistics_from_this_file.rb +142 -0
  552. data/lib/studium/statistics/exam_topics_that_are_about_to_be_completed.rb +119 -0
  553. data/lib/studium/statistics/max_stats.rb +170 -0
  554. data/lib/studium/statistics/new_questions_per_year.rb +147 -0
  555. data/lib/studium/statistics/report_how_many_ects_points_per_curriculum_were_completed.rb +167 -0
  556. data/lib/studium/statistics/report_how_many_exam_questions_were_answered.rb +473 -0
  557. data/lib/studium/statistics/show_exam_statistics.rb +66 -0
  558. data/lib/studium/statistics/show_which_courses_are_in_a_bachelor_or_master_curriculum_respectively.rb +104 -0
  559. data/lib/studium/statistics/top_stats.rb +127 -0
  560. data/lib/studium/toplevel_methods/all_passed_exams.rb +37 -0
  561. data/lib/studium/toplevel_methods/already_solved_this_lecture.rb +100 -0
  562. data/lib/studium/toplevel_methods/available_topics.rb +156 -0
  563. data/lib/studium/toplevel_methods/calculate_pr/303/274fungsimmanente_lectures_from_this_file.rb +55 -0
  564. data/lib/studium/toplevel_methods/copy_the_last_backup_of_file_lecture_information.rb +34 -0
  565. data/lib/studium/toplevel_methods/curriculum_related_code.rb +1082 -0
  566. data/lib/studium/toplevel_methods/determine_local_directory_of_this_lecture.rb +72 -0
  567. data/lib/studium/toplevel_methods/does_this_course_require_mandatory_presence.rb +51 -0
  568. data/lib/studium/toplevel_methods/download.rb +163 -0
  569. data/lib/studium/toplevel_methods/e.rb +16 -0
  570. data/lib/studium/toplevel_methods/ects_from_lectures.rb +250 -0
  571. data/lib/studium/toplevel_methods/editor.rb +65 -0
  572. data/lib/studium/toplevel_methods/esystem.rb +22 -0
  573. data/lib/studium/toplevel_methods/filter_away_invalid_questions.rb +77 -0
  574. data/lib/studium/toplevel_methods/find_exam_topic_and_exam_title.rb +3538 -0
  575. data/lib/studium/toplevel_methods/handle_archive_of_the_exam_questions.rb +136 -0
  576. data/lib/studium/toplevel_methods/has_this_lecture_been_already_passed_but_the_id_was_changed_lateron.rb +42 -0
  577. data/lib/studium/toplevel_methods/has_this_module_been_completed.rb +206 -0
  578. data/lib/studium/toplevel_methods/install_the_project_on_the_given_hostsystem.rb +32 -0
  579. data/lib/studium/toplevel_methods/is_on_roebe.rb +26 -0
  580. data/lib/studium/toplevel_methods/is_this_exam_topic_included.rb +46 -0
  581. data/lib/studium/toplevel_methods/is_this_homepage_registered.rb +31 -0
  582. data/lib/studium/toplevel_methods/is_this_lecture_a_practical_course.rb +93 -0
  583. data/lib/studium/toplevel_methods/is_this_lecture_registered_in_upcoming_exams.rb +42 -0
  584. data/lib/studium/toplevel_methods/java.rb +32 -0
  585. data/lib/studium/toplevel_methods/lecture_information.rb +108 -0
  586. data/lib/studium/toplevel_methods/lva_numbers.rb +355 -0
  587. data/lib/studium/toplevel_methods/main_dataset.rb +73 -0
  588. data/lib/studium/toplevel_methods/map_input_to_this_curriculum_filename.rb +595 -0
  589. data/lib/studium/toplevel_methods/methods_related_to_directories.rb +225 -0
  590. data/lib/studium/toplevel_methods/methods_related_to_files.rb +209 -0
  591. data/lib/studium/toplevel_methods/misc.rb +288 -0
  592. data/lib/studium/toplevel_methods/n_questions_available.rb +137 -0
  593. data/lib/studium/toplevel_methods/n_topics_available.rb +63 -0
  594. data/lib/studium/toplevel_methods/names_of_all_solved_exams.rb +71 -0
  595. data/lib/studium/toplevel_methods/note_down_the_start_time_and_how_many_exams_have_been_already_solved.rb +69 -0
  596. data/lib/studium/toplevel_methods/opnn.rb +25 -0
  597. data/lib/studium/toplevel_methods/passed_this_exam_on.rb +105 -0
  598. data/lib/studium/toplevel_methods/pristine.rb +69 -0
  599. data/lib/studium/toplevel_methods/read_delay_between_questions_from_file.rb +34 -0
  600. data/lib/studium/toplevel_methods/regexes.rb +90 -0
  601. data/lib/studium/toplevel_methods/registered_for_this_exam.rb +82 -0
  602. data/lib/studium/toplevel_methods/remove_comments.rb +26 -0
  603. data/lib/studium/toplevel_methods/remove_exam_topics_that_were_already_answered.rb +27 -0
  604. data/lib/studium/toplevel_methods/remove_tags.rb +32 -0
  605. data/lib/studium/toplevel_methods/report.rb +435 -0
  606. data/lib/studium/toplevel_methods/return_all_exams_on_this_day.rb +66 -0
  607. data/lib/studium/toplevel_methods/return_dataset_for_this_exam_topic.rb +41 -0
  608. data/lib/studium/toplevel_methods/return_ects_from_this_lecture_stored_in_the_file_lecture_information.rb +194 -0
  609. data/lib/studium/toplevel_methods/return_hash_of_already_solved_lectures.rb +46 -0
  610. data/lib/studium/toplevel_methods/return_last_exam_question.rb +34 -0
  611. data/lib/studium/toplevel_methods/return_local_path_of_this_pwdstud.rb +60 -0
  612. data/lib/studium/toplevel_methods/return_lva_number_of_this_lecture.rb +72 -0
  613. data/lib/studium/toplevel_methods/return_n_percent_solved_from_this_topic.rb +90 -0
  614. data/lib/studium/toplevel_methods/return_n_questions_were_answered_for_this_topic.rb +60 -0
  615. data/lib/studium/toplevel_methods/return_proper_university_image.rb +86 -0
  616. data/lib/studium/toplevel_methods/return_question_answer_string_from_this_topic.rb +63 -0
  617. data/lib/studium/toplevel_methods/return_remote_homepage_of_this_lecture.rb +10951 -0
  618. data/lib/studium/toplevel_methods/return_remote_moodle_link_of_this_lecture.rb +2201 -0
  619. data/lib/studium/toplevel_methods/return_sanitized_dataset_from_the_file_lecture_information.rb +110 -0
  620. data/lib/studium/toplevel_methods/return_theme_of_the_next_upcoming_exam.rb +38 -0
  621. data/lib/studium/toplevel_methods/rinstall2.rb +34 -0
  622. data/lib/studium/toplevel_methods/rti_conflict.rb +35 -0
  623. data/lib/studium/toplevel_methods/runmode.rb +87 -0
  624. data/lib/studium/toplevel_methods/sanitized_dataset_from_file_passed_exams_per_month.rb +52 -0
  625. data/lib/studium/toplevel_methods/set_last_file_for_exam_questions.rb +64 -0
  626. data/lib/studium/toplevel_methods/set_this_cd_alias_to.rb +86 -0
  627. data/lib/studium/toplevel_methods/show_passed_exams_having_this_grade.rb +34 -0
  628. data/lib/studium/toplevel_methods/spacer.rb +18 -0
  629. data/lib/studium/toplevel_methods/time.rb +297 -0
  630. data/lib/studium/toplevel_methods/total_ects_points_passed.rb +72 -0
  631. data/lib/studium/toplevel_methods/try_to_guess_the_most_likely_lva_id.rb +57 -0
  632. data/lib/studium/toplevel_methods/try_to_return_the_expanded_name_of_this_lecture.rb +63 -0
  633. data/lib/studium/toplevel_methods/unfinished.rb +51 -0
  634. data/lib/studium/toplevel_methods/url.rb +100 -0
  635. data/lib/studium/toplevel_methods/verbose_truth.rb +36 -0
  636. data/lib/studium/toplevel_methods/when_was_this_lecture_passed.rb +54 -0
  637. data/lib/studium/toplevel_methods/word_wrap.rb +56 -0
  638. data/lib/studium/toplevel_methods/write_into_file_related_functionality.rb +195 -0
  639. data/lib/studium/toplevel_methods/yes_or_no_ja_oder_nein.rb +33 -0
  640. data/lib/studium/universities_in_austria/README.md +2 -0
  641. data/lib/studium/universities_in_austria/boku/README.md +4 -0
  642. data/lib/studium/universities_in_austria/boku/boku_/303/266ffnungszeiten.rb +28 -0
  643. data/lib/studium/universities_in_austria/boku/show_three_pillars_of_these_lectures.rb +110 -0
  644. data/lib/studium/universities_in_austria/boku/three_pillars.rb +237 -0
  645. data/lib/studium/universities_in_austria/tu_vienna/README.md +6 -0
  646. data/lib/studium/universities_in_austria/tu_vienna/tu_ferien.rb +42 -0
  647. data/lib/studium/universities_in_austria/tu_vienna/tu_/303/266ffnungszeiten.rb +34 -0
  648. data/lib/studium/university_course/university_course.rb +384 -0
  649. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_boku_lecture_to_curriculum.rb +384 -0
  650. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_lecture_to_curriculum.rb +238 -0
  651. data/lib/studium/utility_scripts/attribute_lectures_to_university/attribute_lectures_to_university.rb +375 -0
  652. data/lib/studium/utility_scripts/audio_stats.rb +171 -0
  653. data/lib/studium/utility_scripts/auto_stud/auto_stud.rb +252 -0
  654. data/lib/studium/utility_scripts/auto_stud/constants.rb +18 -0
  655. data/lib/studium/utility_scripts/auto_stud/initialize.rb +23 -0
  656. data/lib/studium/utility_scripts/auto_stud/misc.rb +18 -0
  657. data/lib/studium/utility_scripts/autopurge_this_lecture_date.rb +93 -0
  658. data/lib/studium/utility_scripts/average_grade_of_this_curriculum.rb +143 -0
  659. data/lib/studium/utility_scripts/blocked_courses.rb +141 -0
  660. data/lib/studium/utility_scripts/calendar/README.md +2 -0
  661. data/lib/studium/utility_scripts/calendar/calendar.rb +251 -0
  662. data/lib/studium/utility_scripts/calendar/misc.rb +35 -0
  663. data/lib/studium/utility_scripts/check_description_of_these_lectures.rb +221 -0
  664. data/lib/studium/utility_scripts/course_registrations/course_registrations.rb +98 -0
  665. data/lib/studium/utility_scripts/create/README.md +2 -0
  666. data/lib/studium/utility_scripts/create/webpage_of_university.rb +129 -0
  667. data/lib/studium/utility_scripts/create/webpage_of_university_BOKU.rb +59 -0
  668. data/lib/studium/utility_scripts/create/webpage_of_university_TU.rb +58 -0
  669. data/lib/studium/utility_scripts/create/webpage_of_university_UniWien.rb +57 -0
  670. data/lib/studium/utility_scripts/create_database/create_database.rb +106 -0
  671. data/lib/studium/utility_scripts/current_lectures_belonging_to_both_bachelor_and_master_curriculum.rb +113 -0
  672. data/lib/studium/utility_scripts/currently_participating_in_these_lectures/currently_participating_in_these_lectures.rb +104 -0
  673. data/lib/studium/utility_scripts/display_lecture_url.rb +176 -0
  674. data/lib/studium/utility_scripts/expand_time_range/expand_time_range.rb +488 -0
  675. data/lib/studium/utility_scripts/finished_exams_at_this_university.rb +94 -0
  676. data/lib/studium/utility_scripts/foreign_language_percentage/constants.rb +23 -0
  677. data/lib/studium/utility_scripts/foreign_language_percentage/foreign_language_percentage.rb +149 -0
  678. data/lib/studium/utility_scripts/foreign_language_percentage/help.rb +31 -0
  679. data/lib/studium/utility_scripts/foreign_language_percentage/initialize.rb +25 -0
  680. data/lib/studium/utility_scripts/foreign_language_percentage/menu.rb +158 -0
  681. data/lib/studium/utility_scripts/foreign_language_percentage/report.rb +62 -0
  682. data/lib/studium/utility_scripts/foreign_language_percentage/reset.rb +50 -0
  683. data/lib/studium/utility_scripts/foreign_language_percentage/run.rb +19 -0
  684. data/lib/studium/utility_scripts/generate_spreadsheet/generate_spreadsheet.rb +354 -0
  685. data/lib/studium/utility_scripts/generate_spreadsheet/misc.rb +144 -0
  686. data/lib/studium/utility_scripts/holidays/holidays.rb +150 -0
  687. data/lib/studium/utility_scripts/homepage_of_these_courses.rb +118 -0
  688. data/lib/studium/utility_scripts/lecture_downloader.rb +107 -0
  689. data/lib/studium/utility_scripts/lectures_attributed_to_universities.rb +336 -0
  690. data/lib/studium/utility_scripts/lva_dates_of_the_important_courses.rb +111 -0
  691. data/lib/studium/utility_scripts/lva_nummer.rb +431 -0
  692. data/lib/studium/utility_scripts/mandatory_lectures_in_this_month/mandatory_lectures_in_this_month.rb +316 -0
  693. data/lib/studium/utility_scripts/name_of_this_lva_id.rb +110 -0
  694. data/lib/studium/utility_scripts/new_stud.rb +324 -0
  695. data/lib/studium/utility_scripts/next_week.rb +103 -0
  696. data/lib/studium/utility_scripts/open_last_exam_question_url_link_via_the_browser.rb +76 -0
  697. data/lib/studium/utility_scripts/passed_ects_per_year/passed_ects_per_year.rb +288 -0
  698. data/lib/studium/utility_scripts/passed_pr/303/274fungsimmanente_courses/passed_pr/303/274fungsimmanente_courses.rb +181 -0
  699. data/lib/studium/utility_scripts/pdf/README.md +2 -0
  700. data/lib/studium/utility_scripts/pdf/create_pdf_file_for_this_exam_topic.rb +355 -0
  701. data/lib/studium/utility_scripts/pdf/hexapdf_support.rb +50 -0
  702. data/lib/studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb +312 -0
  703. data/lib/studium/utility_scripts/priority.rb +164 -0
  704. data/lib/studium/utility_scripts/priority_points/priority_points.rb +263 -0
  705. data/lib/studium/utility_scripts/publish_my_exams.rb +174 -0
  706. data/lib/studium/utility_scripts/regexes/README.md +1 -0
  707. data/lib/studium/utility_scripts/regexes/generate_regex.rb +314 -0
  708. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_available_moodle_links.rb +55 -0
  709. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_registered_lectures.rb +48 -0
  710. data/lib/studium/utility_scripts/report_outdated_timetable_entries/report_outdated_timetable_entries.rb +142 -0
  711. data/lib/studium/utility_scripts/report_total_amount_of_questions_and_answers_for.rb +116 -0
  712. data/lib/studium/utility_scripts/report_whether_this_lecture_is_registered_in_the_file_lecture_information.rb +128 -0
  713. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/individual_resolve_practical_courses_date_conflicts.rb +254 -0
  714. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/resolve_practical_courses_date_conflicts.rb +265 -0
  715. data/lib/studium/utility_scripts/scrape_remote_university_url.rb +138 -0
  716. data/lib/studium/utility_scripts/semester_schedule_creator/semester_container.rb +144 -0
  717. data/lib/studium/utility_scripts/semester_schedule_creator/semester_schedule_creator.rb +374 -0
  718. data/lib/studium/utility_scripts/semesterplaner.rb +289 -0
  719. data/lib/studium/utility_scripts/set_aliases_based_on_this_file.rb +97 -0
  720. data/lib/studium/utility_scripts/show_all_passed_master_lectures.rb +119 -0
  721. data/lib/studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb +1339 -0
  722. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/constants.rb +23 -0
  723. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/menu.rb +63 -0
  724. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/reset.rb +33 -0
  725. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/run.rb +50 -0
  726. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/show_descriptions_of_lectures_belonging_to_this_module.rb +145 -0
  727. data/lib/studium/utility_scripts/show_lecturers/show_lecturers.rb +147 -0
  728. data/lib/studium/utility_scripts/show_lectures/constants.rb +11 -0
  729. data/lib/studium/utility_scripts/show_lectures/help.rb +35 -0
  730. data/lib/studium/utility_scripts/show_lectures/initialize.rb +23 -0
  731. data/lib/studium/utility_scripts/show_lectures/menu.rb +138 -0
  732. data/lib/studium/utility_scripts/show_lectures/misc.rb +606 -0
  733. data/lib/studium/utility_scripts/show_lectures/reset.rb +89 -0
  734. data/lib/studium/utility_scripts/show_lectures/run.rb +28 -0
  735. data/lib/studium/utility_scripts/show_lectures/show_lectures.rb +49 -0
  736. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_language/show_lectures_fitting_to_this_language.rb +121 -0
  737. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_theme/show_lectures_fitting_to_this_theme.rb +105 -0
  738. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb +3142 -0
  739. data/lib/studium/utility_scripts/show_lectures_on_this_day.rb +149 -0
  740. data/lib/studium/utility_scripts/show_lva_dates_of_this_lecture.rb +169 -0
  741. data/lib/studium/utility_scripts/show_mixed_bachelor_master_courses/show_mixed_bachelor_master_courses.rb +91 -0
  742. data/lib/studium/utility_scripts/show_outdated_lva_dates/show_outdated_lva_dates.rb +210 -0
  743. data/lib/studium/utility_scripts/show_solved_english_lectures/show_solved_english_lectures.rb +139 -0
  744. data/lib/studium/utility_scripts/steop/README.md +4 -0
  745. data/lib/studium/utility_scripts/steop/show_all_steop_lectures.rb +93 -0
  746. data/lib/studium/utility_scripts/steop/steop_lectures_in_this_curriculum.rb +284 -0
  747. data/lib/studium/utility_scripts/steop/steop_lva_dates.rb +119 -0
  748. data/lib/studium/utility_scripts/studienkennzahl.rb +116 -0
  749. data/lib/studium/utility_scripts/studium_skeleton/studium_skeleton.rb +231 -0
  750. data/lib/studium/utility_scripts/stundenplan.rb +595 -0
  751. data/lib/studium/utility_scripts/sync_studium_relevant_entries_one_level_downwards.rb +217 -0
  752. data/lib/studium/utility_scripts/ufind/ufind.rb +98 -0
  753. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/constants.rb +26 -0
  754. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/run.rb +20 -0
  755. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/upcoming_mandatory_presence_courses.rb +187 -0
  756. data/lib/studium/utility_scripts/week_parser/constants.rb +23 -0
  757. data/lib/studium/utility_scripts/week_parser/help.rb +32 -0
  758. data/lib/studium/utility_scripts/week_parser/menu.rb +59 -0
  759. data/lib/studium/utility_scripts/week_parser/misc.rb +373 -0
  760. data/lib/studium/utility_scripts/week_parser/reset.rb +65 -0
  761. data/lib/studium/utility_scripts/week_parser/run.rb +18 -0
  762. data/lib/studium/utility_scripts/week_parser/show.rb +236 -0
  763. data/lib/studium/utility_scripts/week_parser/week_parser.rb +49 -0
  764. data/lib/studium/utility_scripts/weekday_parser.rb +155 -0
  765. data/lib/studium/utility_scripts/weekly_schedule.rb +198 -0
  766. data/lib/studium/utility_scripts/wochenplanung.rb +261 -0
  767. data/lib/studium/version/version.rb +46 -0
  768. data/lib/studium/www/curriculum_displayer.rb +162 -0
  769. data/lib/studium/www/exams.cgi +54 -0
  770. data/lib/studium/www/fast_ask_exam_question.cgi +156 -0
  771. data/lib/studium/www/handle_curricula/handle_curricula.cgi +154 -0
  772. data/lib/studium/www/next_generation_exam_question_trainer/next_generation_exam_question_trainer.cgi +79 -0
  773. data/lib/studium/www/sinatra/app.rb +231 -0
  774. data/lib/studium/www/sinatra/misc.rb +115 -0
  775. data/lib/studium/www/statistics/statistics.cgi +70 -0
  776. data/lib/studium/yaml/ad_hoc_trainer/README.md +2 -0
  777. data/lib/studium/yaml/ad_hoc_trainer/exam_topics.md +15 -0
  778. data/lib/studium/yaml/allowed_themes_for_exams/allowed_themes_for_exams.yml +347 -0
  779. data/lib/studium/yaml/array_allowed_entries_for_the_file_lecture_information.yml +71 -0
  780. data/lib/studium/yaml/available_exam_topics/available_exam_topics.yml +234 -0
  781. data/lib/studium/yaml/backlog_of_exams.yml +37 -0
  782. data/lib/studium/yaml/colours/custom_colours.yml +28 -0
  783. data/lib/studium/yaml/colours/use_colours.yml +1 -0
  784. data/lib/studium/yaml/current_exams.yml +30 -0
  785. data/lib/studium/yaml/curricula/README.md +39 -0
  786. data/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml +147 -0
  787. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml +71 -0
  788. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_botanik_033630.yml +100 -0
  789. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_ecology_033630.yml +74 -0
  790. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml +122 -0
  791. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_molekulare_biologie_033630.yml +106 -0
  792. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_zoologie_033630.yml +87 -0
  793. data/lib/studium/yaml/curricula/bachelor/bachelor_chemie_033662.yml +165 -0
  794. data/lib/studium/yaml/curricula/bachelor/bachelor_dummy_curriculum.yml +182 -0
  795. data/lib/studium/yaml/curricula/bachelor/bachelor_elektrotechnik_und_informationstechnik_033235.yml +13 -0
  796. data/lib/studium/yaml/curricula/bachelor/bachelor_forstwirtschaft_033225.yml +115 -0
  797. data/lib/studium/yaml/curricula/bachelor/bachelor_informatik_033521.yml +136 -0
  798. data/lib/studium/yaml/curricula/bachelor/bachelor_ktww_033231.yml +84 -0
  799. data/lib/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml +121 -0
  800. data/lib/studium/yaml/curricula/bachelor/bachelor_medizinische_informatik_033533.yml +283 -0
  801. data/lib/studium/yaml/curricula/bachelor/bachelor_molekularbiologie_033665.yml +95 -0
  802. data/lib/studium/yaml/curricula/bachelor/bachelor_nutrition_science_033638.yml +119 -0
  803. data/lib/studium/yaml/curricula/bachelor/bachelor_pharmazie_033305.yml +170 -0
  804. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_chemie_033290.yml +131 -0
  805. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_informatik_033535.yml +23 -0
  806. data/lib/studium/yaml/curricula/bachelor/bachelor_ubrm_033227.yml +143 -0
  807. data/lib/studium/yaml/curricula/bachelor/bachelor_verfahrenstechnik_033273.yml +167 -0
  808. data/lib/studium/yaml/curricula/bachelor/bachelor_wirtschaftsinformatik_033526.yml +29 -0
  809. data/lib/studium/yaml/curricula/experimental/bachelor_informatik_in_den_lebenswissenschaften.yml +137 -0
  810. data/lib/studium/yaml/curricula/individual/bachelor_formale_logik.yml +88 -0
  811. data/lib/studium/yaml/curricula/individual/bachelor_informatik_und_molekulare_biologie.yml +1161 -0
  812. data/lib/studium/yaml/curricula/individual/bachelor_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +1157 -0
  813. data/lib/studium/yaml/curricula/individual/master_bioinformatics_and_nanobiotechnology_in_molecular_medicine.yml +306 -0
  814. data/lib/studium/yaml/curricula/individual/master_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +741 -0
  815. data/lib/studium/yaml/curricula/master/master_bioinformatik_066875.yml +75 -0
  816. data/lib/studium/yaml/curricula/master/master_biologie_molekulare_mikrobiologie_mikrobielle_oekologie_und_immunbiologie_066830.yml +78 -0
  817. data/lib/studium/yaml/curricula/master/master_biologische_chemie_066863.yml +66 -0
  818. data/lib/studium/yaml/curricula/master/master_dummy_curriculum.yml +197 -0
  819. data/lib/studium/yaml/curricula/master/master_genetik_und_entwicklungsbiologie_066877.yml +89 -0
  820. data/lib/studium/yaml/curricula/master/master_lmbt_066418.yml +112 -0
  821. data/lib/studium/yaml/curricula/master/master_molecular_biology_066865.yml +72 -0
  822. data/lib/studium/yaml/curricula/master/master_molekulare_biologie_066834.yml +151 -0
  823. data/lib/studium/yaml/curricula/master/master_pharmazie_066605.yml +176 -0
  824. data/lib/studium/yaml/curricula/master/master_technische_chemie_066490.yml +123 -0
  825. data/lib/studium/yaml/curricula/outdated/master_bioinformatics_and_molecular_biotechnology_including_aspects_from_molecular_medicine.yml +438 -0
  826. data/lib/studium/yaml/curricula/outdated/master_food_science_and_plant_biotechnology.yml +31 -0
  827. data/lib/studium/yaml/curricula.yml +562 -0
  828. data/lib/studium/yaml/daily_questions_solved.yml +1654 -0
  829. data/lib/studium/yaml/default_delay.yml +4 -0
  830. data/lib/studium/yaml/default_encoding.yml +1 -0
  831. data/lib/studium/yaml/directory_to_the_exam_topics.yml +0 -0
  832. data/lib/studium/yaml/editor.yml +1 -0
  833. data/lib/studium/yaml/exams/next_exams_to_do.md +9 -0
  834. data/lib/studium/yaml/file_for_exam_questions.yml +1 -0
  835. data/lib/studium/yaml/german/README.md +2 -0
  836. data/lib/studium/yaml/german/german_to_english_month_names.yml +16 -0
  837. data/lib/studium/yaml/grouped_themes.yml +192 -0
  838. data/lib/studium/yaml/holidays.yml +201 -0
  839. data/lib/studium/yaml/important_exams.yml +266 -0
  840. data/lib/studium/yaml/inscription_dates_of_universities.yml +60 -0
  841. data/lib/studium/yaml/lecture_aliases.yml +138 -0
  842. data/lib/studium/yaml/lecture_information/lecture_information.yml +61740 -0
  843. data/lib/studium/yaml/log_dir.yml +1 -0
  844. data/lib/studium/yaml/main_topic.yml +11 -0
  845. data/lib/studium/yaml/max_stats.yml +249 -0
  846. data/lib/studium/yaml/meta_themes/README.md +13 -0
  847. data/lib/studium/yaml/meta_themes/biochemistry.md +6 -0
  848. data/lib/studium/yaml/meta_themes/bioinformatics.md +6 -0
  849. data/lib/studium/yaml/meta_themes/biotechnology.md +9 -0
  850. data/lib/studium/yaml/meta_themes/cellbiology.md +9 -0
  851. data/lib/studium/yaml/meta_themes/chemistry.md +9 -0
  852. data/lib/studium/yaml/meta_themes/genetics.md +10 -0
  853. data/lib/studium/yaml/meta_themes/immunology.md +5 -0
  854. data/lib/studium/yaml/meta_themes/metabolic_pathways.md +12 -0
  855. data/lib/studium/yaml/meta_themes/molecular_biology.md +9 -0
  856. data/lib/studium/yaml/meta_themes/protein_engineering.md +10 -0
  857. data/lib/studium/yaml/meta_themes/statistics.md +2 -0
  858. data/lib/studium/yaml/mitbelegung/README.md +4 -0
  859. data/lib/studium/yaml/mitbelegung/mitbelegung.yml +21 -0
  860. data/lib/studium/yaml/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.yml +363 -0
  861. data/lib/studium/yaml/n_total_questions.yml +1 -0
  862. data/lib/studium/yaml/rename_konsole_tab.yml +1 -0
  863. data/lib/studium/yaml/semester_planner/README.md +4 -0
  864. data/lib/studium/yaml/semester_planner/semester_planner.yml +189 -0
  865. data/lib/studium/yaml/show_topic.yml +1 -0
  866. data/lib/studium/yaml/statistics/lecture_information.yml +1 -0
  867. data/lib/studium/yaml/statistics/max_stats.yml +239 -0
  868. data/lib/studium/yaml/statistics/statistics.yml +75 -0
  869. data/lib/studium/yaml/week/01_monday.yml +25 -0
  870. data/lib/studium/yaml/week/02_tuesday.yml +68 -0
  871. data/lib/studium/yaml/week/03_wednesday.yml +63 -0
  872. data/lib/studium/yaml/week/04_thursday.yml +20 -0
  873. data/lib/studium/yaml/week/05_friday.yml +31 -0
  874. data/lib/studium/yaml/week/06_saturday.yml +16 -0
  875. data/lib/studium/yaml/week/07_sunday.yml +0 -0
  876. data/lib/studium/yaml/week/README.md +10 -0
  877. data/lib/studium.rb +5 -0
  878. data/studium.gemspec +82 -0
  879. data/test/testing_studium.rb +244 -0
  880. data/test/testing_studium_base_class.rb +31 -0
  881. data/test/testing_the_file_lecture_information.rb +18 -0
  882. data/test/testing_time_component.rb +29 -0
  883. metadata +1094 -0
@@ -0,0 +1,898 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'studium/exams/exam_question/misc.rb'
6
+ # =========================================================================== #
7
+ require 'studium/base/base.rb'
8
+
9
+ module Studium
10
+
11
+ module Exams
12
+
13
+ class ExamQuestion < ::Studium::Base # === Studium::Exams::ExamQuestion
14
+
15
+ require 'studium/toplevel_methods/handle_archive_of_the_exam_questions.rb'
16
+ require 'studium/toplevel_methods/write_into_file_related_functionality.rb'
17
+ require 'studium/exams/exam_question/constants.rb'
18
+ require 'studium/exams/exam_question/question.rb'
19
+
20
+ # ========================================================================= #
21
+ # === ask_the_question_then_sleep_then_reveal_the_answer_to_that_question
22
+ # ========================================================================= #
23
+ def ask_the_question_then_sleep_then_reveal_the_answer_to_that_question
24
+ # ======================================================================= #
25
+ # Next warn the user if there are too many exams registered. This
26
+ # should be shown after the topic has been optionally displayed.
27
+ # Afterwards we will begin to ask the exam-question at hand.
28
+ # ======================================================================= #
29
+ consider_warning_the_user_if_there_are_too_many_exams_registered
30
+ ask_the_exam_question
31
+ sleep_default_delay
32
+ reveal_the_exam_answer
33
+ end; alias ask_question_then_show_the_answer_after_a_delay ask_the_question_then_sleep_then_reveal_the_answer_to_that_question # === ask_question_then_show_the_answer_after_a_delay
34
+ alias do_ask_a_random_question_before_showing_the_answer ask_the_question_then_sleep_then_reveal_the_answer_to_that_question # === ask_question_then_show_the_answer_after_a_delay
35
+ alias show_question_then_sleep_then_show_answer ask_the_question_then_sleep_then_reveal_the_answer_to_that_question # === show_question_then_sleep_then_show_answer
36
+ alias ask_sleep_show ask_the_question_then_sleep_then_reveal_the_answer_to_that_question # === ask_sleep_show
37
+ alias ask_the_question_then_reveal_the_answer ask_the_question_then_sleep_then_reveal_the_answer_to_that_question # === ask_the_question_then_reveal_the_answer
38
+
39
+ # ========================================================================= #
40
+ # === fancy_cliner
41
+ #
42
+ # Since as of April 2022 this method can also optionally display some
43
+ # content. If this is the case then said content will be padded
44
+ # via '*'.
45
+ # ========================================================================= #
46
+ def fancy_cliner(
47
+ optional_content_to_be_displayed = nil
48
+ )
49
+ print seagreen('') # Always reset the colour here first.
50
+ if optional_content_to_be_displayed
51
+ e mediumaquamarine('*' * 3)+' '+
52
+ forestgreen( # or lightskyblue
53
+ optional_content_to_be_displayed
54
+ )+
55
+ ' '+
56
+ mediumaquamarine(
57
+ '*' * (75 - optional_content_to_be_displayed.size)
58
+ )
59
+ else
60
+ cliner('*', :mediumaquamarine)
61
+ end
62
+ end
63
+
64
+ require 'studium/toplevel_methods/report.rb'
65
+ # ========================================================================= #
66
+ # === show_how_many_exam_questions_were_already_solved_in_german
67
+ #
68
+ # Similar to the above, except that we will report in german.
69
+ #
70
+ # Invocation example:
71
+ #
72
+ # qa --solved-in-german
73
+ #
74
+ # ========================================================================= #
75
+ def show_how_many_exam_questions_were_already_solved_in_german
76
+ Studium::Exams.report_how_many_exam_questions_were_already_solved(:german)
77
+ end
78
+
79
+ # ========================================================================= #
80
+ # === open_the_last_file_via_your_editor
81
+ # ========================================================================= #
82
+ def open_the_last_file_via_your_editor(
83
+ this_file = last_file?
84
+ )
85
+ open_this_file_in_editor(this_file)
86
+ end
87
+
88
+ # ========================================================================= #
89
+ # === open_this_file_in_editor
90
+ #
91
+ # Open this file in the editor.
92
+ # ========================================================================= #
93
+ def open_this_file_in_editor(
94
+ this_file = __FILE__
95
+ )
96
+ use_this_editor = editor?
97
+ # ======================================================================= #
98
+ # Since as of December 2017, on my home system, I will use nano instead.
99
+ # ======================================================================= #
100
+ use_this_editor = 'nano -w' if is_on_roebe?
101
+ _ = "#{use_this_editor} #{this_file}" #&
102
+ esystem _
103
+ end
104
+
105
+ # ========================================================================= #
106
+ # === notify_the_user_that_all_questions_have_been_answered_already
107
+ # ========================================================================= #
108
+ def notify_the_user_that_all_questions_have_been_answered_already(
109
+ which_topic = which_topic?
110
+ )
111
+ opnn; e 'All questions have already been answered '
112
+ opnn; e "for the topic `#{orange(which_topic)}`. "\
113
+ "#{slateblue(cheering_person?)}"
114
+ end
115
+
116
+ # ========================================================================= #
117
+ # === custom_colours?
118
+ # ========================================================================= #
119
+ def custom_colours?
120
+ [
121
+ @internal_hash[:colour_for_questions],
122
+ @internal_hash[:colour_for_answers]
123
+ ]
124
+ end
125
+
126
+ # ========================================================================= #
127
+ # === set_exam_pool
128
+ #
129
+ # The "exam pool" constitutes the available, unanswered exams.
130
+ #
131
+ # What this means, essentially, is that every line ending with a '[]'
132
+ # will be disregarded.
133
+ # ========================================================================= #
134
+ def set_exam_pool(i = nil)
135
+ @internal_hash[:exam_pool] = i
136
+ end
137
+
138
+ # ========================================================================= #
139
+ # === store_delay (store tag)
140
+ #
141
+ # This method will store/save the delay into a file.
142
+ # ========================================================================= #
143
+ def store_delay(i)
144
+ Studium.save_this_delay_between_questions_and_answers(i)
145
+ end
146
+
147
+ # ========================================================================= #
148
+ # === load_file_rename_konsole_tab
149
+ # ========================================================================= #
150
+ def load_file_rename_konsole_tab
151
+ YAML.load_file(FILE_RENAME_KONSOLE_TAB)
152
+ end
153
+
154
+ # ========================================================================= #
155
+ # === main_file_exists?
156
+ # ========================================================================= #
157
+ def main_file_exists?(
158
+ i = exam_file?
159
+ )
160
+ i and File.exist?(i)
161
+ end
162
+
163
+ # ========================================================================= #
164
+ # === show_the_last_topic
165
+ #
166
+ # Invocation example:
167
+ #
168
+ # qa --show-last-topic
169
+ #
170
+ # ========================================================================= #
171
+ def show_the_last_topic(
172
+ _ = FILE_LAST_TOPIC
173
+ )
174
+ if File.exist? _
175
+ e rev+'The last topic was `'+
176
+ simp(
177
+ expand_topic(File.read(_).chomp)
178
+ )+'`.'
179
+ else
180
+ opnn; no_file_exists_at(_.to_s)
181
+ end
182
+ end
183
+
184
+ # ========================================================================= #
185
+ # === set_all_questions_from_the_topic_to_solved
186
+ #
187
+ # This will solve all questions from a given topic.
188
+ #
189
+ # Invocation example:
190
+ #
191
+ # qa ALL_SOLVED
192
+ #
193
+ # ========================================================================= #
194
+ def set_all_questions_from_the_topic_to_solved
195
+ if commandline?
196
+ require 'studium/exams/solve_all_questions_from_this_topic.rb'
197
+ this_topic = which_topic?
198
+ e "#{rev}Setting all questions from the topic "\
199
+ "#{sfancy(this_topic)} to solved."
200
+ Studium::SolveAllQuestionsFromThisTopic.new(this_topic)
201
+ end
202
+ end
203
+
204
+ # ========================================================================= #
205
+ # === report_this_error
206
+ # ========================================================================= #
207
+ def report_this_error(error = nil)
208
+ opnn; e 'We encountered an '+swarn('error')+
209
+ '. The @index_position was probably '\
210
+ 'out of range.'
211
+ opnn; e 'Feedbacking @line next:'
212
+ pp line?
213
+ opnn; e "Feedbacking #{royalblue('the split position')} next:"
214
+ pp split_position?
215
+ if error
216
+ pp error
217
+ pp error.class
218
+ end
219
+ end
220
+
221
+ # ========================================================================= #
222
+ # === report_how_many_registered_questions_are_available
223
+ # ========================================================================= #
224
+ def report_how_many_registered_questions_are_available(
225
+ n_questions = ::Studium.n_questions_available?
226
+ )
227
+ opnn; e "#{rev}There are #{simp(n_questions.to_s)} registered "\
228
+ "questions available."
229
+ end
230
+
231
+ # ========================================================================= #
232
+ # === show_how_many_exam_questions_were_already_solved
233
+ #
234
+ # Use this method to show how many exam questions were already solved.
235
+ #
236
+ # To invoke this method, do:
237
+ #
238
+ # qa SOLVED?
239
+ #
240
+ # Or in code, do:
241
+ #
242
+ # Studium::Exams.report_how_many_exam_questions_were_already_solved
243
+ #
244
+ # ========================================================================= #
245
+ def show_how_many_exam_questions_were_already_solved
246
+ Studium.report_how_many_exam_questions_were_already_solved
247
+ end
248
+
249
+ # ========================================================================= #
250
+ # === edit_sanitize_topics_in_vim
251
+ #
252
+ # To trigger this, do:
253
+ #
254
+ # qa --vim
255
+ #
256
+ # ========================================================================= #
257
+ def edit_sanitize_topics_in_vim
258
+ position_in_the_file = 445
259
+ file =
260
+ RUBY_STUDIUM_HOME_DIR+'toplevel_methods/find_exam_topic_and_exam_title.rb'
261
+ _ = 'vim '+file+' +'+position_in_the_file.to_s
262
+ esystem _
263
+ end
264
+
265
+ # ========================================================================= #
266
+ # === show_content_of_this_topic
267
+ #
268
+ # Invocation example:
269
+ #
270
+ # qa ethik --show-everything
271
+ #
272
+ # ========================================================================= #
273
+ def show_content_of_this_topic(
274
+ i = topic?
275
+ )
276
+ dataset = filter_away_invalid_questions(
277
+ File.readlines(directory_to_the_exam_topics?+i)
278
+ )
279
+ dataset.each {|line|
280
+ e " #{simp(line.chomp)}"
281
+ }
282
+ end
283
+
284
+ # ========================================================================= #
285
+ # === try_to_save_the_line (save tag)
286
+ #
287
+ # This is called whenever the main line is obtained. The original line
288
+ # is copied, not any modified variant.
289
+ #
290
+ # We will store into a file, which is kept at @store_where.
291
+ #
292
+ # It usually defaults to the file /Depot/Studium/last_question_asked.md
293
+ # or wherever else the base-directory has been defined.
294
+ # ========================================================================= #
295
+ def try_to_save_the_line(
296
+ i = line?
297
+ )
298
+ _ = store_where? # Where to store.
299
+ if File.exist?(File.dirname(_))
300
+ if debug?
301
+ opnn; e "Now saving: #{bold_blue(i)} into the file #{sfile(_)}"
302
+ end if commandline?
303
+ if File.writable?(File.dirname(_)) # Make sure the base-directory is writeable here.
304
+ write_what_into(i, _) # Save it.
305
+ end
306
+ end
307
+ end
308
+
309
+ # ========================================================================= #
310
+ # === store_where?
311
+ # ========================================================================= #
312
+ def store_where?
313
+ Studium.file_last_question_asked?
314
+ end
315
+
316
+ require 'studium/logging/store_last_question_asked_into_file.rb'
317
+ # ========================================================================= #
318
+ # === do_log_related_and_backup_related_actions
319
+ #
320
+ # This method will backup files and similar activities.
321
+ # ========================================================================= #
322
+ def do_log_related_and_backup_related_actions
323
+ unless Studium.is_in_www_mode?
324
+ Studium.backup_this_exam_file(exam_file?) # { :be_verbose }
325
+ hash = {} # Build up our data structure here, as a Hash.
326
+ hash[:question_was_asked_when] = Time.now
327
+ hash[:question_full_line] = line?
328
+ Studium::Log::StoreLastQuestionAskedIntoFile.new(hash) # { :be_verbose }
329
+ end
330
+ end
331
+
332
+ # ========================================================================= #
333
+ # === generate_statistical_webpage
334
+ #
335
+ # Invoke like so:
336
+ #
337
+ # qa --www
338
+ #
339
+ # ========================================================================= #
340
+ def generate_statistical_webpage
341
+ require 'studium/statistics/report_how_many_exam_questions_were_answered.rb'
342
+ Studium::Statistics::ReportHowManyExamQuestionsWereAnswered.generate_webpage
343
+ require 'open'
344
+ Open.in_browser(
345
+ Dir.home+'/Studium/html/statistics.html'
346
+ )
347
+ end
348
+
349
+ # ========================================================================= #
350
+ # === report_file_does_not_exist
351
+ # ========================================================================= #
352
+ def report_file_does_not_exist(
353
+ this_file = exam_file?
354
+ )
355
+ opnn; e "#{rev}No file at `#{sfile(this_file)}` exists."
356
+ end
357
+
358
+ require 'studium/toplevel_methods/set_last_file_for_exam_questions.rb'
359
+ # ========================================================================= #
360
+ # === register_last_modified_file
361
+ # ========================================================================= #
362
+ def register_last_modified_file(
363
+ i = exam_file?
364
+ )
365
+ Studium.set_last_file_for_exam_questions(i) # , :be_verbose
366
+ end
367
+
368
+ require 'studium/toplevel_methods/n_questions_available.rb'
369
+ # ========================================================================= #
370
+ # === show_how_many_exam_questions_are_available
371
+ #
372
+ # This method can be called by passing in 'TOTAL' as argument.
373
+ #
374
+ # Example:
375
+ #
376
+ # qa TOTAL?
377
+ #
378
+ # ========================================================================= #
379
+ def show_how_many_exam_questions_are_available
380
+ n_questions = ::Studium.n_questions_available?.to_s
381
+ result = 'Total amount of registered questions: '.dup
382
+ if commandline? and use_colours?
383
+ result << simp(n_questions.to_s)
384
+ else
385
+ result << n_questions.to_s
386
+ end
387
+ e result
388
+ end; alias total show_how_many_exam_questions_are_available # === total (total tag)
389
+ alias n_total_questions_available? show_how_many_exam_questions_are_available # === n_total_questions_available?
390
+
391
+ # ========================================================================= #
392
+ # === opnn
393
+ # ========================================================================= #
394
+ def opnn
395
+ super(
396
+ namespace: @namespace,
397
+ use_colours: use_colours?
398
+ )
399
+ end
400
+
401
+ # ========================================================================= #
402
+ # === determine_whether_we_will_rename_the_konsole_tab
403
+ #
404
+ # This method should be called from within the method called reset().
405
+ # ========================================================================= #
406
+ def determine_whether_we_will_rename_the_konsole_tab
407
+ if is_on_roebe?
408
+ if File.exist? FILE_RENAME_KONSOLE_TAB
409
+ _ = load_file_rename_konsole_tab
410
+ if _ == true
411
+ do_rename_konsole_tab
412
+ else
413
+ do_not_rename_konsole_tab
414
+ end
415
+ else
416
+ do_not_rename_konsole_tab
417
+ end
418
+ else
419
+ do_not_rename_konsole_tab
420
+ end
421
+ end
422
+
423
+ # ========================================================================= #
424
+ # === show_last_question_asked
425
+ #
426
+ # This will show the last question asked.
427
+ # ========================================================================= #
428
+ def show_last_question_asked(
429
+ i = store_where?
430
+ )
431
+ if File.exist? i
432
+ e File.read(i)
433
+ end
434
+ end
435
+
436
+ # ========================================================================= #
437
+ # === consider_renaming_konsole_tab
438
+ #
439
+ # We will delegate to class SetTerminalTitle in order to rename the KDE
440
+ # konsole title.
441
+ # ========================================================================= #
442
+ def consider_renaming_konsole_tab
443
+ if Studium::Exams::ExamQuestion.rename_konsole_tab?
444
+ rename_kde_konsole_tab(topic?)
445
+ end
446
+ end
447
+
448
+ # ========================================================================= #
449
+ # === do_rename_konsole_tab
450
+ # ========================================================================= #
451
+ def do_rename_konsole_tab
452
+ Studium::Exams::ExamQuestion.set_rename_konsole_tab(true)
453
+ end
454
+
455
+ # ========================================================================= #
456
+ # === do_not_rename_konsole_tab
457
+ # ========================================================================= #
458
+ def do_not_rename_konsole_tab
459
+ Studium::Exams::ExamQuestion.set_rename_konsole_tab(false)
460
+ end
461
+
462
+ # ========================================================================= #
463
+ # === try_to_read_in_the_dataset_from_the_corresponding_exam_file
464
+ # ========================================================================= #
465
+ def try_to_read_in_the_dataset_from_the_corresponding_exam_file(
466
+ _ = exam_topics_directory?+
467
+ topic?.to_s
468
+ )
469
+ if File.exist? _
470
+ # ===================================================================== #
471
+ # Keep track of where the exam-file can be found.
472
+ # ===================================================================== #
473
+ set_exam_file(_)
474
+ @internal_hash[:dataset_from_the_file] =
475
+ read_in_exam_dataset_from_this_file(_)
476
+ else
477
+ report_file_does_not_exist(_)
478
+ end
479
+ end
480
+
481
+ require 'studium/toplevel_methods/download.rb'
482
+ # ========================================================================= #
483
+ # === download_exam_topics
484
+ #
485
+ # You can use this method to download all exam topics.
486
+ #
487
+ # To call this, do:
488
+ #
489
+ # qa --dexamtopics
490
+ #
491
+ # ========================================================================= #
492
+ def download_exam_topics
493
+ Studium.download_exam_topics
494
+ end
495
+
496
+ # ========================================================================= #
497
+ # === result?
498
+ # ========================================================================= #
499
+ def result?
500
+ @internal_hash[:result_for_www]
501
+ end
502
+
503
+ # ========================================================================= #
504
+ # === exam_pool?
505
+ # ========================================================================= #
506
+ def exam_pool?
507
+ @internal_hash[:exam_pool]
508
+ end
509
+
510
+ # ========================================================================= #
511
+ # === show_available_topics (topics tag)
512
+ #
513
+ # This method will show which topics are all available.
514
+ #
515
+ # By default, it will also exit after having done so.
516
+ #
517
+ # To invoke this method, try:
518
+ #
519
+ # qa topics?
520
+ # qa --show-available-topics
521
+ #
522
+ # ========================================================================= #
523
+ def show_available_topics(
524
+ shall_we_exit = true
525
+ )
526
+ e
527
+ use_these_topics = Studium.available_topics.sort # And sort it.
528
+ use_these_topics.each_with_index {|category, index|
529
+ # ===================================================================== #
530
+ # Number the results via the index.
531
+ # ===================================================================== #
532
+ index = '%4s' % ('('+(index+1).to_s)
533
+ result = ' '.dup
534
+ if use_colours?
535
+ result << ::Colours::CYAN if commandline?
536
+ end
537
+ result << "#{index}) - " # Add the index here.
538
+ if use_colours? # And "close" the escape-sequences next.
539
+ result << rev if commandline?
540
+ end
541
+ category = category.to_s.delete('_')
542
+ category = steelblue(category) if use_colours?
543
+ result << category
544
+ e result
545
+ }
546
+ e
547
+ exit if shall_we_exit
548
+ end
549
+
550
+ # ========================================================================= #
551
+ # === word_wrap_at?
552
+ # ========================================================================= #
553
+ def word_wrap_at?
554
+ @internal_hash[:word_wrap_at]
555
+ end
556
+
557
+ # ========================================================================= #
558
+ # === set_exam_topic
559
+ #
560
+ # We need to store the expanded topic name, so that something like
561
+ # "bioanalytik" is turned into "bioanalytik_und_biosensoren".
562
+ #
563
+ # Whenever a topic is set through this method, this will also be
564
+ # stored into a file. This then allows us to query what the
565
+ # last topic was, e. g. via "qa --last_topic?".
566
+ # ========================================================================= #
567
+ def set_exam_topic(
568
+ i = first_non_hyphen_argument?
569
+ )
570
+ i = i.first if i.is_a? Array
571
+ # ======================================================================= #
572
+ # === Handle Hashes
573
+ #
574
+ # If a Hash is given then we will try to find a specific key in that
575
+ # Hash.
576
+ # ======================================================================= #
577
+ if i.is_a?(Hash) and i.has_key?(:use_this_topic)
578
+ i = i[:use_this_topic]
579
+ end
580
+ case i
581
+ when nil, ''
582
+ i = 'random_topic' # or :random
583
+ end
584
+ i = i.to_s.dup # Work with a String past this point.
585
+ i.downcase! # Convention is to store the file downcased.
586
+ case i
587
+ # ======================================================================= #
588
+ # === random
589
+ #
590
+ # We fetch a random topic via this entry-point.
591
+ # ======================================================================= #
592
+ when 'fetch_a_random_topic',
593
+ 'random_topic',
594
+ 'random',
595
+ 'rand'
596
+ i = ::Studium::Exams.random_short_name_topic # This is allowed, for random topics.
597
+ # i = ::Studium.return_random_exam_topic # ← This may be an alternative.
598
+ # ======================================================================= #
599
+ # === molbio
600
+ #
601
+ # This entry point is special.
602
+ # ======================================================================= #
603
+ when 'molbio',
604
+ 'molekularbiologie',
605
+ 'molbio?'
606
+ i = 'amg|amg2|genex1|gentech1|gentech2|pcr'
607
+ # ======================================================================= #
608
+ # === OLAST
609
+ # ======================================================================= #
610
+ when /^qlast$/i,
611
+ /^olast$/i # === olast tag
612
+ _ = FILE_LAST_TOPIC
613
+ if File.exist? _
614
+ i = File.read(FILE_LAST_TOPIC).strip
615
+ else
616
+ opnn; no_file_exists_at(_)
617
+ end
618
+ end
619
+ # ======================================================================= #
620
+ # If the input has a '|', we assume that the user wants to randomly
621
+ # pick one entry.
622
+ # ======================================================================= #
623
+ if i.include? '|'
624
+ i = i.split('|').shuffle
625
+ end
626
+ # ======================================================================= #
627
+ # Before we do the real assignment, we will sanitize this through
628
+ # the Studium.find_corresponding_exam_topic "filter".
629
+ # ======================================================================= #
630
+ if Studium.is_this_a_registered_exam_topic?(i)
631
+ i = Studium.find_corresponding_exam_topic(i)
632
+ else
633
+ opnn; e "Not a registered exam topic: #{i}"
634
+ end
635
+ @internal_hash[:topic] = i
636
+ # ======================================================================= #
637
+ # Next we will store the topic into a file.
638
+ # ======================================================================= #
639
+ unless in_www_mode?
640
+ store_last_topic_into_file(i)
641
+ end
642
+ end; alias set_this_topic set_exam_topic # === set_this_topic
643
+ alias determine_the_topic set_exam_topic # === determine_the_topic
644
+ alias determine_the_exam_topic set_exam_topic # === determine_the_exam_topic
645
+
646
+ # ========================================================================= #
647
+ # === assign_url
648
+ #
649
+ # Only call this method after making a line.include? 'URL:' check.
650
+ # The reason for this is that we will only apply this method on
651
+ # a line that has this substring representing a remote URL.
652
+ # ========================================================================= #
653
+ def assign_url(i)
654
+ if use_unicode_symbols?
655
+ nice_token = '➡' # We will use a slightly prettier symbol for Unicode in this case.
656
+ else
657
+ nice_token = '=>'
658
+ end
659
+ i =~ /URL:\s*(.*)( |)/
660
+ url = sanitize_url($1.to_s.dup) # URL is something like: "http://de.wikipedia.org/wiki/Ester"
661
+ url = url.first if url.is_a? Array
662
+ i = i.dup if i.frozen?
663
+ begin
664
+ # ===================================================================== #
665
+ # The next regex shall also check for input such as:
666
+ #
667
+ # URL: https://en.wikipedia.org/wiki/2,4-Dinitrophenol
668
+ # URL: https://en.wikipedia.org/wiki/File:Histidin_-_Histidine.svg
669
+ #
670
+ # Since as of 11.11.2018, we also include any other entry that
671
+ # starts with 'https:'.
672
+ # ===================================================================== #
673
+ if $1 # See: https://rubular.com/r/rNeLS2MH6f
674
+ remote_URL = $1.to_s.dup
675
+ i.gsub!(/URL:\s*(.*)( |)/, nice_token+' \1') # ← Also add a '=>' token.
676
+ if is_on_roebe?
677
+ # ================================================================= #
678
+ # Store this on my home system in a file, in this case.
679
+ # ================================================================= #
680
+ what = "#{remote_URL}\n"
681
+ into = log_dir?+'last_exam_questions_URL.md'
682
+ append_what_into(what, into)
683
+ end
684
+ end
685
+ i = i.to_s.dup
686
+ return i
687
+ rescue Exception => error
688
+ e "Debugging for `#{sfancy(i.to_s)}`:"
689
+ pp error
690
+ p url.class
691
+ e sfancy(url)
692
+ end
693
+ end
694
+
695
+ # ========================================================================= #
696
+ # === show_statistics
697
+ #
698
+ # To invoke this method from the commandline, try:
699
+ #
700
+ # qa --show-statistics
701
+ #
702
+ # ========================================================================= #
703
+ def show_statistics(
704
+ dataset = dataset?
705
+ )
706
+ unless in_www_mode?
707
+ n_questions = n_questions_available?
708
+ n_answered = n_questions_already_answered?
709
+ percentage = (n_answered.to_f * 100) / n_questions
710
+ result = olivedrab(n_questions.to_s)+
711
+ grey(' questions available, ')+
712
+ mediumaquamarine(n_answered.to_s)+
713
+ grey(' (')+
714
+ colourize_percentage(percentage.round(2).to_s+'%')+
715
+ grey(") already answered.#{N}")
716
+ # ===================================================================== #
717
+ # Also add how many questions in absolute numbers have to be answered
718
+ # still.
719
+ # ===================================================================== #
720
+ padded_amount_of_questions_answered = (n_questions - n_answered).to_s
721
+ padded_amount_of_questions_answered =
722
+ padded_amount_of_questions_answered.rjust(n_questions.to_s.size)
723
+ result << "#{crimson(padded_amount_of_questions_answered)} "\
724
+ "#{grey('questions could still be answered. Topic: ')}"\
725
+ "#{olive(return_the_full_expanded_exam_title)}"\
726
+ "#{grey('.')}#{rev}"
727
+ e result
728
+ end
729
+ end; alias report_statistics show_statistics # === report_statistics
730
+
731
+ # ========================================================================= #
732
+ # === parse_the_random_line_from_the_obtained_dataset
733
+ #
734
+ # This method must also determine the split-position in the given
735
+ # exam-question-line, which is also called the "index" position.
736
+ #
737
+ # Example string:
738
+ #
739
+ # - Name abc def. A: <one>DNA-Methylation</one>.
740
+ #
741
+ # ========================================================================= #
742
+ def parse_the_random_line_from_the_obtained_dataset(
743
+ # ===================================================================== #
744
+ # Obtain a handle to the exam-question-line first.
745
+ # ===================================================================== #
746
+ _ = @internal_hash[:exam_question_line]
747
+ )
748
+ # if _
749
+ # # =================================================================== #
750
+ # # We will chop off leading '- ' tokens next. The reason for this
751
+ # # is that these leading '- ' are NEVER a part of a question-answer
752
+ # # combination. They exist purely because of this being visually
753
+ # # more pleasing to my eyes, so a cosmetic thing.
754
+ # # This was, however had, disabled in January of 2022, because it
755
+ # # led to problems in regards to storing the full line, which had
756
+ # # to be stored in an unmodified manner.
757
+ # # =================================================================== #
758
+ # _ = _.dup if _.frozen?
759
+ # if _.start_with? '- '
760
+ # _[0, 2] = '' # Chop off leading '- ' tokens.
761
+ # end
762
+ # end
763
+ if _.nil?
764
+ notify_the_user_that_all_questions_have_been_answered_already
765
+ exit_program
766
+ return
767
+ end
768
+ # ======================================================================= #
769
+ # We must determine the question and answer next. We do this by
770
+ # determining the index to split at. First, initialize it to 0.
771
+ # ======================================================================= #
772
+ index_to_split_at = 0
773
+ # ======================================================================= #
774
+ # The first strategy that is employed by this method is that the most
775
+ # important '?' token is to be found. If it is found then we can split
776
+ # split on it. This is, by definition, the very last '?' that
777
+ # we can find in the given String, hence why we use .rindex()
778
+ # rather than .index().
779
+ # ======================================================================= #
780
+ if _.include?('?')
781
+ index_to_split_at = _.rindex('?')
782
+ # ===================================================================== #
783
+ # Some entries may have a '?' but also a 'A:' token. In this case,
784
+ # we have to change the index position. However had, we must be
785
+ # careful here, as a few answers will contain something like this
786
+ # here:
787
+ #
788
+ # '(1) A: Asymmetry (2) B: Border (3) C: Color (4) D: Diameter (5) E: Evolving'
789
+ #
790
+ # ===================================================================== #
791
+ if _.include?('?') and
792
+ _.include?(' A: ') and
793
+ !(_ =~ /\d{1}\) A: /) # The last one here is explained above.
794
+ index_to_split_at = _.index(' A: ')
795
+ end
796
+ set_split_position(index_to_split_at)
797
+ elsif _.include?(' A: ') # This should be the only valid format in this case.
798
+ index_to_split_at = _.index(' A: ')
799
+ set_split_position(index_to_split_at)
800
+ else # And here we report that something isn't quite right in the given file.
801
+ opnn; e 'No ? and no A: was found. Please check the following line:'
802
+ e
803
+ e " #{tomato(_)}"
804
+ e
805
+ opnn; e
806
+ opnn; report_this_error
807
+ opnn; e
808
+ end
809
+ set_exam_question(_[0 .. index_to_split_at])
810
+ set_exam_answer(_[index_to_split_at .. -1])
811
+ end; alias determine_the_split_position parse_the_random_line_from_the_obtained_dataset # === determine_the_split_position
812
+ alias determine_index_position parse_the_random_line_from_the_obtained_dataset # === determine_index_position
813
+ alias parse_that_line parse_the_random_line_from_the_obtained_dataset # === parse_that_line
814
+ alias determine_the_question_and_the_answer parse_the_random_line_from_the_obtained_dataset # === determine_the_question_and_the_answer
815
+ alias determine_question_answer parse_the_random_line_from_the_obtained_dataset # === determine_question_answer
816
+
817
+ # ========================================================================= #
818
+ # === set_exam_question_line
819
+ #
820
+ # A full exam-question line, also shorter called "line", is a line that
821
+ # contains a question, and the associated answer to this question.
822
+ #
823
+ # This setter may not modify anything - we just want to assign to the
824
+ # correct entry in our main Hash. Additionally the line itself may
825
+ # not be tampered with at all, so that we can act on that information,
826
+ # such as by storing that line into a local file.
827
+ # ========================================================================= #
828
+ def set_exam_question_line(i)
829
+ if i.is_a? Array
830
+ i = i.first.to_s.dup # We only need the first entry in this case, if it is an Array.
831
+ end
832
+ # ======================================================================= #
833
+ # === Handle blocks next
834
+ # ======================================================================= #
835
+ if block_given?
836
+ case yield
837
+ # ===================================================================== #
838
+ # === :then_determine_the_split_position
839
+ # ===================================================================== #
840
+ when :then_determine_the_split_position
841
+ determine_the_split_position
842
+ end
843
+ end
844
+ @internal_hash[:exam_question_line] = i
845
+ end; alias set_line set_exam_question_line # === set_line
846
+ alias set_this_line set_exam_question_line # === set_this_line
847
+
848
+ # ========================================================================= #
849
+ # === store_last_topic_into_file
850
+ #
851
+ # By default we will not report this activity.
852
+ # ========================================================================= #
853
+ def store_last_topic_into_file(
854
+ what = topic?,
855
+ into = FILE_LAST_TOPIC # This would store into: "/root/Studium/last_topic.md"
856
+ )
857
+ write_what_into(what, into)
858
+ end
859
+
860
+ # ========================================================================= #
861
+ # === show_all_finished_exam_topics
862
+ #
863
+ # To invoke this method, do:
864
+ #
865
+ # qa --finished?
866
+ #
867
+ # ========================================================================= #
868
+ def show_all_finished_exam_topics
869
+ stats = Studium::Statistics::ReportHowManyExamQuestionsWereAnswered.new {
870
+ :do_not_show_the_result
871
+ }.internal_dataset
872
+ e "#{rev}The following topics are completely answered "\
873
+ "(#{colourize_percentage('100%')} answered ratio)."
874
+ array_finished_topics = []
875
+ stats.select {|key, value|
876
+ percentage = value[:percentage_of_questions_answered]
877
+ if percentage == 100.0
878
+ array_finished_topics << ::Studium.beautify_this_topic(key)
879
+ end
880
+ }
881
+ e
882
+ array_finished_topics.each {|topic|
883
+ e " #{simp(topic)} is completely answered."
884
+ }
885
+ e
886
+ end
887
+
888
+ # ========================================================================= #
889
+ # === exam_file?
890
+ #
891
+ # This query-method shows as to where the specific file at hand is.
892
+ # ========================================================================= #
893
+ def exam_file?
894
+ @internal_hash[:exam_file]
895
+ end; alias file? exam_file? # === file?
896
+ alias which_file? exam_file? # === which_file?
897
+
898
+ end; end; end