studium 0.13.1

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 (871) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2785 -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 +7 -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 +81 -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 +2742 -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/todo/TODO_FOR_STUDIUM_GEM.md +112 -0
  56. data/doc/todo/TODO_FOR_THE_GRAPHICAL_PARTS_OF_THE_STUDIUM_GEM_INCLUDING_WWW_RELATED_ASPECTS.md +35 -0
  57. data/img/STUDIES.png +0 -0
  58. data/lib/studium/autoinclude.rb +7 -0
  59. data/lib/studium/base/base.rb +2710 -0
  60. data/lib/studium/base/prototype.rb +543 -0
  61. data/lib/studium/c/README.md +2 -0
  62. data/lib/studium/c/a.out +0 -0
  63. data/lib/studium/c/obtain_random_entry.c +11 -0
  64. data/lib/studium/check_and_sanitize/README.md +11 -0
  65. data/lib/studium/check_and_sanitize/check_curriculum_for_correct_separation_of_bachelor_and_master.rb +141 -0
  66. data/lib/studium/check_and_sanitize/check_for_all_exam_topics_being_registered.rb +110 -0
  67. data/lib/studium/check_and_sanitize/check_for_correct_themes_of_each_course.rb +90 -0
  68. data/lib/studium/check_and_sanitize/check_for_existing_description_of_this_lecture.rb +189 -0
  69. data/lib/studium/check_and_sanitize/check_the_lecture_information_file.rb +163 -0
  70. data/lib/studium/check_and_sanitize/find_duplicate_lectures.rb +115 -0
  71. data/lib/studium/check_and_sanitize/missing_priority_entry.rb +44 -0
  72. data/lib/studium/check_and_sanitize/sanitize_this_string_containing_the_lva_dates.rb +79 -0
  73. data/lib/studium/colours/colours.rb +549 -0
  74. data/lib/studium/colours/sfancy.rb +46 -0
  75. data/lib/studium/colours/sfile.rb +35 -0
  76. data/lib/studium/colours/simp.rb +40 -0
  77. data/lib/studium/colours/use_colours.rb +39 -0
  78. data/lib/studium/colours/use_this_colour_for_exam_questions_and_exam_answers.rb +80 -0
  79. data/lib/studium/commandline/commandline.rb +932 -0
  80. data/lib/studium/commandline/menu.rb +903 -0
  81. data/lib/studium/constants/colours.rb +14 -0
  82. data/lib/studium/constants/constants.rb +2142 -0
  83. data/lib/studium/constants/image_constants.rb +217 -0
  84. data/lib/studium/constants/web_constants.rb +25 -0
  85. data/lib/studium/css/project.css +267 -0
  86. data/lib/studium/curricula/curriculum.rb +210 -0
  87. data/lib/studium/curricula/curriculum_as_string.rb +280 -0
  88. data/lib/studium/curricula/curriculum_module_displayer/constants.rb +33 -0
  89. data/lib/studium/curricula/curriculum_module_displayer/curriculum_module_displayer.rb +417 -0
  90. data/lib/studium/curricula/curriculum_module_displayer/initialize.rb +25 -0
  91. data/lib/studium/curricula/curriculum_module_displayer/menu.rb +45 -0
  92. data/lib/studium/curricula/curriculum_module_displayer/reset.rb +74 -0
  93. data/lib/studium/curricula/curriculum_module_displayer/run.rb +20 -0
  94. data/lib/studium/curricula/curriculum_module_displayer/set_use_this_curriculum.rb +93 -0
  95. data/lib/studium/curricula/curriculum_module_displayer/show_and_report.rb +190 -0
  96. data/lib/studium/curricula/determine_curricula/constants.rb +11 -0
  97. data/lib/studium/curricula/determine_curricula/determine_curricula.rb +36 -0
  98. data/lib/studium/curricula/determine_curricula/help.rb +39 -0
  99. data/lib/studium/curricula/determine_curricula/initialize.rb +48 -0
  100. data/lib/studium/curricula/determine_curricula/menu.rb +151 -0
  101. data/lib/studium/curricula/determine_curricula/misc.rb +403 -0
  102. data/lib/studium/curricula/determine_curricula/report.rb +143 -0
  103. data/lib/studium/curricula/determine_curricula/reset.rb +59 -0
  104. data/lib/studium/curricula/determine_curricula/run.rb +19 -0
  105. data/lib/studium/curricula/determine_elective_courses_in_this_curriculum.rb +112 -0
  106. data/lib/studium/curricula/display_bachelor_curricula.rb +90 -0
  107. data/lib/studium/curricula/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.rb +324 -0
  108. data/lib/studium/curricula/modules/display_on_the_commandline.rb +319 -0
  109. data/lib/studium/curricula/modules/return_n_ects_in_this_module.rb +75 -0
  110. data/lib/studium/curricula/n_percent_solved_in_this_curriculum.rb +75 -0
  111. data/lib/studium/curricula/prepare_individual_curriculum.rb +304 -0
  112. data/lib/studium/curricula/random_curriculum_creator/random_curriculum_creator.rb +163 -0
  113. data/lib/studium/curricula/show_lectures_of_this_curriculum.rb +114 -0
  114. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/constants.rb +11 -0
  115. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/initialize.rb +27 -0
  116. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/menu.rb +35 -0
  117. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/misc.rb +264 -0
  118. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/report.rb +163 -0
  119. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/reset.rb +64 -0
  120. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/show_lectures_of_this_curriculum_id.rb +38 -0
  121. data/lib/studium/curricula/show_solved_percentage_among_the_registered_curricula.rb +87 -0
  122. data/lib/studium/ects/boku_ects_splitter.rb +128 -0
  123. data/lib/studium/ects/ects_per_university.rb +179 -0
  124. data/lib/studium/ects/ects_scanner.rb +141 -0
  125. data/lib/studium/ects/ects_to_university_parser.rb +142 -0
  126. data/lib/studium/ects/last_entry_is_curriculum.rb +150 -0
  127. data/lib/studium/ects/n_ects_in_these_lectures.rb +196 -0
  128. data/lib/studium/ects/n_ects_points_in_mandatory_presence_courses.rb +50 -0
  129. data/lib/studium/ects/return_n_ects_from_this_file.rb +59 -0
  130. data/lib/studium/ects/return_n_ects_from_this_url.rb +196 -0
  131. data/lib/studium/ects/search_for_n_ects.rb +614 -0
  132. data/lib/studium/ects/show_completed_ects_in_all_curricula.rb +191 -0
  133. data/lib/studium/ects/show_passed_credits_per_curriculum.rb +276 -0
  134. data/lib/studium/ects/simple_total_ects_points.rb +135 -0
  135. data/lib/studium/ects/solved_ects/constants.rb +19 -0
  136. data/lib/studium/ects/solved_ects/reset.rb +51 -0
  137. data/lib/studium/ects/solved_ects/solved_ects.rb +325 -0
  138. data/lib/studium/ects/solved_ects_per_university/reset.rb +25 -0
  139. data/lib/studium/ects/solved_ects_per_university/solved_ects_per_university.rb +106 -0
  140. data/lib/studium/ects/still_missing.rb +129 -0
  141. data/lib/studium/ects/sum_of_ects.rb +144 -0
  142. data/lib/studium/encoding/encoding.rb +108 -0
  143. data/lib/studium/exam_topics/RNAi_siRNA_and_miRNA +86 -0
  144. data/lib/studium/exam_topics/abfall_als_ressource +86 -0
  145. data/lib/studium/exam_topics/advanced_biochemistry +781 -0
  146. data/lib/studium/exam_topics/advanced_biotechnology +214 -0
  147. data/lib/studium/exam_topics/advanced_cellbiology +27 -0
  148. data/lib/studium/exam_topics/advanced_chemistry +504 -0
  149. data/lib/studium/exam_topics/advanced_microbiology +43 -0
  150. data/lib/studium/exam_topics/advanced_topics_in_plant_sciences +85 -0
  151. data/lib/studium/exam_topics/advanced_virology +218 -0
  152. data/lib/studium/exam_topics/ageing +114 -0
  153. data/lib/studium/exam_topics/agrar_ecology +63 -0
  154. data/lib/studium/exam_topics/agrarmarkt +71 -0
  155. data/lib/studium/exam_topics/agrarphysik +35 -0
  156. data/lib/studium/exam_topics/alcohols +29 -0
  157. data/lib/studium/exam_topics/algorithms +52 -0
  158. data/lib/studium/exam_topics/allergie +75 -0
  159. data/lib/studium/exam_topics/allgemeine_genetik +1006 -0
  160. data/lib/studium/exam_topics/allgemeine_mikrobiologie +946 -0
  161. data/lib/studium/exam_topics/aminoacids +438 -0
  162. data/lib/studium/exam_topics/analytische_chemie_1 +132 -0
  163. data/lib/studium/exam_topics/analytische_chemie_2 +31 -0
  164. data/lib/studium/exam_topics/anatomie +290 -0
  165. data/lib/studium/exam_topics/anorganische_chemie +311 -0
  166. data/lib/studium/exam_topics/anthropologie +116 -0
  167. data/lib/studium/exam_topics/antibodies_and_antigens +764 -0
  168. data/lib/studium/exam_topics/apoptosis +35 -0
  169. data/lib/studium/exam_topics/archaea +60 -0
  170. data/lib/studium/exam_topics/architecture +8 -0
  171. data/lib/studium/exam_topics/artificial_intelligence +81 -0
  172. data/lib/studium/exam_topics/atomemissionsspektrometrie +6 -0
  173. data/lib/studium/exam_topics/audio +11 -0
  174. data/lib/studium/exam_topics/bacteriophages +240 -0
  175. data/lib/studium/exam_topics/basic_biochemistry +1002 -0
  176. data/lib/studium/exam_topics/basic_biotechnology +1001 -0
  177. data/lib/studium/exam_topics/basic_chemistry +1007 -0
  178. data/lib/studium/exam_topics/basic_virology +1008 -0
  179. data/lib/studium/exam_topics/bauwesen +6 -0
  180. data/lib/studium/exam_topics/betriebssysteme +126 -0
  181. data/lib/studium/exam_topics/betriebswirtschaftslehre +29 -0
  182. data/lib/studium/exam_topics/bioanalytik_und_biosensoren +382 -0
  183. data/lib/studium/exam_topics/biochips +78 -0
  184. data/lib/studium/exam_topics/bioelektrochemie +57 -0
  185. data/lib/studium/exam_topics/biofilms +22 -0
  186. data/lib/studium/exam_topics/bioinformatics +503 -0
  187. data/lib/studium/exam_topics/biological_therapeutics +153 -0
  188. data/lib/studium/exam_topics/biologie +137 -0
  189. data/lib/studium/exam_topics/biomarkers +106 -0
  190. data/lib/studium/exam_topics/biomaterials +89 -0
  191. data/lib/studium/exam_topics/biomembranes +6 -0
  192. data/lib/studium/exam_topics/bionik +65 -0
  193. data/lib/studium/exam_topics/biophysik +34 -0
  194. data/lib/studium/exam_topics/biopolymers +10 -0
  195. data/lib/studium/exam_topics/bioprozesstechnik +149 -0
  196. data/lib/studium/exam_topics/bioressourcenmanagement +78 -0
  197. data/lib/studium/exam_topics/bodenkunde +373 -0
  198. data/lib/studium/exam_topics/bodenmikrobiologie +40 -0
  199. data/lib/studium/exam_topics/cancerbiology +442 -0
  200. data/lib/studium/exam_topics/cell_cultures +155 -0
  201. data/lib/studium/exam_topics/cellbiology +995 -0
  202. data/lib/studium/exam_topics/cellular_transport_and_protein_secretion +27 -0
  203. data/lib/studium/exam_topics/cellulose +6 -0
  204. data/lib/studium/exam_topics/chemische_technologie_anorganischer_stoffe +209 -0
  205. data/lib/studium/exam_topics/chemische_technologie_organischer_stoffe +25 -0
  206. data/lib/studium/exam_topics/chemisches_labor +60 -0
  207. data/lib/studium/exam_topics/chemotaxis_and_motility_in_prokaryotes +87 -0
  208. data/lib/studium/exam_topics/citric_acid_cycle +80 -0
  209. data/lib/studium/exam_topics/clinical_microbiology +492 -0
  210. data/lib/studium/exam_topics/computer_graphics +5 -0
  211. data/lib/studium/exam_topics/computer_science +280 -0
  212. data/lib/studium/exam_topics/crispr +28 -0
  213. data/lib/studium/exam_topics/cyanobacteria +42 -0
  214. data/lib/studium/exam_topics/cytogenetics_and_chromosome_biology +551 -0
  215. data/lib/studium/exam_topics/cytokines +5 -0
  216. data/lib/studium/exam_topics/databases_and_sql +106 -0
  217. data/lib/studium/exam_topics/dna_mutation_and_dna_repair +35 -0
  218. data/lib/studium/exam_topics/dna_replication +56 -0
  219. data/lib/studium/exam_topics/ecogenetics +26 -0
  220. data/lib/studium/exam_topics/ecological_agriculture +12 -0
  221. data/lib/studium/exam_topics/ecology +314 -0
  222. data/lib/studium/exam_topics/economy +211 -0
  223. data/lib/studium/exam_topics/elektronenmikroskopie +354 -0
  224. data/lib/studium/exam_topics/elektrophorese +89 -0
  225. data/lib/studium/exam_topics/elektrotechnik_und_elektrizit/303/244t +41 -0
  226. data/lib/studium/exam_topics/elisa +54 -0
  227. data/lib/studium/exam_topics/embryologie_und_entwicklung +547 -0
  228. data/lib/studium/exam_topics/endospores_and_spores +104 -0
  229. data/lib/studium/exam_topics/enzymes_and_cofactors +345 -0
  230. data/lib/studium/exam_topics/epigenetik +179 -0
  231. data/lib/studium/exam_topics/ethik +138 -0
  232. data/lib/studium/exam_topics/evolution_and_evolutionary_genetics +328 -0
  233. data/lib/studium/exam_topics/excel +7 -0
  234. data/lib/studium/exam_topics/fish +19 -0
  235. data/lib/studium/exam_topics/fluorescence_microscopy +7 -0
  236. data/lib/studium/exam_topics/food_microbiology_and_food_biotechnology +71 -0
  237. data/lib/studium/exam_topics/forensik +11 -0
  238. data/lib/studium/exam_topics/forstwirtschaft +53 -0
  239. data/lib/studium/exam_topics/fortgeschrittene_genetik +511 -0
  240. data/lib/studium/exam_topics/fortgeschrittene_gentechnik +211 -0
  241. data/lib/studium/exam_topics/fortgeschrittene_physik +6 -0
  242. data/lib/studium/exam_topics/fungi +79 -0
  243. data/lib/studium/exam_topics/genetische_krankheiten +176 -0
  244. data/lib/studium/exam_topics/genexpression +1008 -0
  245. data/lib/studium/exam_topics/genomics_and_metagenomics +244 -0
  246. data/lib/studium/exam_topics/gentechnik_und_praktische_biochemie +901 -0
  247. data/lib/studium/exam_topics/geochemistry +67 -0
  248. data/lib/studium/exam_topics/geography +8 -0
  249. data/lib/studium/exam_topics/geologie_und_mineralogie +621 -0
  250. data/lib/studium/exam_topics/geometrie +47 -0
  251. data/lib/studium/exam_topics/geschichte +93 -0
  252. data/lib/studium/exam_topics/gluconeogenesis +59 -0
  253. data/lib/studium/exam_topics/glycogen +25 -0
  254. data/lib/studium/exam_topics/glycolysis +109 -0
  255. data/lib/studium/exam_topics/glykomik +100 -0
  256. data/lib/studium/exam_topics/glyoxylatzyklus +31 -0
  257. data/lib/studium/exam_topics/grassland_cultivation +32 -0
  258. data/lib/studium/exam_topics/hormone +134 -0
  259. data/lib/studium/exam_topics/html +7 -0
  260. data/lib/studium/exam_topics/human_ecology +8 -0
  261. data/lib/studium/exam_topics/hygiene +191 -0
  262. data/lib/studium/exam_topics/imaging_and_microscopy +241 -0
  263. data/lib/studium/exam_topics/immunanalytik +94 -0
  264. data/lib/studium/exam_topics/immunologie +982 -0
  265. data/lib/studium/exam_topics/informatik +97 -0
  266. data/lib/studium/exam_topics/innate_immunity +22 -0
  267. data/lib/studium/exam_topics/insekten +57 -0
  268. data/lib/studium/exam_topics/insulin_and_diabetes +57 -0
  269. data/lib/studium/exam_topics/java +502 -0
  270. data/lib/studium/exam_topics/javascript +12 -0
  271. data/lib/studium/exam_topics/klima +6 -0
  272. data/lib/studium/exam_topics/kryptographie +5 -0
  273. data/lib/studium/exam_topics/landtechnik +26 -0
  274. data/lib/studium/exam_topics/lebensmittel +208 -0
  275. data/lib/studium/exam_topics/lebensmitteltechnologie +16 -0
  276. data/lib/studium/exam_topics/linux +5 -0
  277. data/lib/studium/exam_topics/lipids +94 -0
  278. data/lib/studium/exam_topics/macroeconomics +40 -0
  279. data/lib/studium/exam_topics/mathematics +254 -0
  280. data/lib/studium/exam_topics/medizin_und_biomedizinische_technik +250 -0
  281. data/lib/studium/exam_topics/medizinische_chemie_und_pharmazie +398 -0
  282. data/lib/studium/exam_topics/messtechnik_und_regeltechnik +104 -0
  283. data/lib/studium/exam_topics/metabolismus +406 -0
  284. data/lib/studium/exam_topics/microbial_ecology +35 -0
  285. data/lib/studium/exam_topics/microcontrollers +11 -0
  286. data/lib/studium/exam_topics/mikrobielle_lebensgemeinschaften +33 -0
  287. data/lib/studium/exam_topics/mikrobielle_physiologie +172 -0
  288. data/lib/studium/exam_topics/mitochondria +32 -0
  289. data/lib/studium/exam_topics/mixed +278 -0
  290. data/lib/studium/exam_topics/molecular_biology_of_plants +242 -0
  291. data/lib/studium/exam_topics/molekulare_medizin +131 -0
  292. data/lib/studium/exam_topics/nanotechnologie +453 -0
  293. data/lib/studium/exam_topics/nature_conservation_and_biodiversity +166 -0
  294. data/lib/studium/exam_topics/naturstoffe +9 -0
  295. data/lib/studium/exam_topics/netzwerke +32 -0
  296. data/lib/studium/exam_topics/neurobiology +267 -0
  297. data/lib/studium/exam_topics/nucleotide_sequencing +32 -0
  298. data/lib/studium/exam_topics/nutztierethologie +11 -0
  299. data/lib/studium/exam_topics/object_oriented_modeling +14 -0
  300. data/lib/studium/exam_topics/obstbau +234 -0
  301. data/lib/studium/exam_topics/organische_chemie +1007 -0
  302. data/lib/studium/exam_topics/organische_chemie_2 +118 -0
  303. data/lib/studium/exam_topics/paleobiology +35 -0
  304. data/lib/studium/exam_topics/parasitic_diseases_and_molecular_infection_biology +335 -0
  305. data/lib/studium/exam_topics/patent_law +55 -0
  306. data/lib/studium/exam_topics/pathologie +717 -0
  307. data/lib/studium/exam_topics/pcr +144 -0
  308. data/lib/studium/exam_topics/pentosephosphatweg +41 -0
  309. data/lib/studium/exam_topics/peroxisomes_glycosomes_and_lysosomes +54 -0
  310. data/lib/studium/exam_topics/pflanzenanatomie +255 -0
  311. data/lib/studium/exam_topics/pflanzenbau +24 -0
  312. data/lib/studium/exam_topics/pflanzenschutz +35 -0
  313. data/lib/studium/exam_topics/pflanzenwissenschaften +1009 -0
  314. data/lib/studium/exam_topics/pharmaceutical_biotechnology +250 -0
  315. data/lib/studium/exam_topics/physik +433 -1
  316. data/lib/studium/exam_topics/physikalische_chemie +86 -0
  317. data/lib/studium/exam_topics/physiology_and_histology +506 -0
  318. data/lib/studium/exam_topics/phytochemie +33 -0
  319. data/lib/studium/exam_topics/plant_biotechnology +128 -0
  320. data/lib/studium/exam_topics/plant_breeding +64 -0
  321. data/lib/studium/exam_topics/plant_development +50 -0
  322. data/lib/studium/exam_topics/populationsgenetik +136 -0
  323. data/lib/studium/exam_topics/posttranslationale_modifikation_von_proteinen +191 -0
  324. data/lib/studium/exam_topics/projektmanagement +219 -0
  325. data/lib/studium/exam_topics/prokaryote_genetics +531 -0
  326. data/lib/studium/exam_topics/protein_engineering +8 -0
  327. data/lib/studium/exam_topics/proteolyse +33 -0
  328. data/lib/studium/exam_topics/proteomik +40 -0
  329. data/lib/studium/exam_topics/prozesstechnik +95 -0
  330. data/lib/studium/exam_topics/psychologie +13 -0
  331. data/lib/studium/exam_topics/python +353 -0
  332. data/lib/studium/exam_topics/quality_management +256 -0
  333. data/lib/studium/exam_topics/rechtsgrundlagen +115 -0
  334. data/lib/studium/exam_topics/research_topics_in_immunobiology +42 -0
  335. data/lib/studium/exam_topics/rna_and_dna +395 -0
  336. data/lib/studium/exam_topics/rna_seq +11 -0
  337. data/lib/studium/exam_topics/ruby +146 -0
  338. data/lib/studium/exam_topics/ruby_on_rails +63 -0
  339. data/lib/studium/exam_topics/scientific_writing_and_publishing +38 -0
  340. data/lib/studium/exam_topics/semisynthese_von_proteinen_und_nukleotiden +120 -0
  341. data/lib/studium/exam_topics/sexualbiologie +62 -0
  342. data/lib/studium/exam_topics/signal_transduction_and_laser_systems +167 -0
  343. data/lib/studium/exam_topics/splicing_exons_and_introns +63 -0
  344. data/lib/studium/exam_topics/statistik +233 -0
  345. data/lib/studium/exam_topics/stemcells +158 -0
  346. data/lib/studium/exam_topics/stickstofffixierung +75 -0
  347. data/lib/studium/exam_topics/structural_bioinformatics +54 -0
  348. data/lib/studium/exam_topics/strukturbiologie +380 -0
  349. data/lib/studium/exam_topics/system_biology_and_synthetic_biology +101 -0
  350. data/lib/studium/exam_topics/systematische_zoologie +433 -0
  351. data/lib/studium/exam_topics/technical_ecology +144 -0
  352. data/lib/studium/exam_topics/technische_chemie +202 -0
  353. data/lib/studium/exam_topics/technische_grundlagen_der_informatik +26 -0
  354. data/lib/studium/exam_topics/technische_mikrobiologie +393 -0
  355. data/lib/studium/exam_topics/technisches_zeichnen +5 -0
  356. data/lib/studium/exam_topics/the_bacterial_cell_wall +97 -0
  357. data/lib/studium/exam_topics/the_c_plus_plus_programming_language +489 -0
  358. data/lib/studium/exam_topics/the_c_programming_language +129 -0
  359. data/lib/studium/exam_topics/the_cellcycle +81 -0
  360. data/lib/studium/exam_topics/the_european_union +119 -0
  361. data/lib/studium/exam_topics/the_interferon_system +38 -0
  362. data/lib/studium/exam_topics/the_microbiome +163 -0
  363. data/lib/studium/exam_topics/the_universe +12 -0
  364. data/lib/studium/exam_topics/theoretische_chemie +5 -0
  365. data/lib/studium/exam_topics/theoretische_informatik +157 -0
  366. data/lib/studium/exam_topics/tierzucht +94 -0
  367. data/lib/studium/exam_topics/toxikologie +408 -0
  368. data/lib/studium/exam_topics/transcription +82 -0
  369. data/lib/studium/exam_topics/translation_ribosomes_and_translational_control +142 -0
  370. data/lib/studium/exam_topics/umweltbiotechnologie +63 -0
  371. data/lib/studium/exam_topics/umweltchemie +233 -0
  372. data/lib/studium/exam_topics/urbanism_and_traffic +19 -0
  373. data/lib/studium/exam_topics/urea_cycle +55 -0
  374. data/lib/studium/exam_topics/vaccines_and_vaccination +242 -0
  375. data/lib/studium/exam_topics/vectors_and_gene_therapy +240 -0
  376. data/lib/studium/exam_topics/verfahrenstechnik +32 -0
  377. data/lib/studium/exam_topics/veterinary_medicine +10 -0
  378. data/lib/studium/exam_topics/vitamine +24 -0
  379. data/lib/studium/exam_topics/wasserkunde +137 -0
  380. data/lib/studium/exam_topics/weinbau +59 -0
  381. data/lib/studium/exam_topics/wissenschaft +18 -0
  382. data/lib/studium/exam_topics/yeast +102 -0
  383. data/lib/studium/exam_topics/zoologie +330 -0
  384. data/lib/studium/exams/afterburn/afterburn.rb +257 -0
  385. data/lib/studium/exams/ask_exam_from_the_upcoming_exams_pool.rb +150 -0
  386. data/lib/studium/exams/ask_exam_topic_question.rb +112 -0
  387. data/lib/studium/exams/ask_question_from_alias.rb +141 -0
  388. data/lib/studium/exams/ask_question_from_any_of_the_still_missing_lectures.rb +131 -0
  389. data/lib/studium/exams/ask_question_from_grouped_themes.rb +141 -0
  390. data/lib/studium/exams/ask_question_from_last_topic.rb +91 -0
  391. data/lib/studium/exams/ask_random_question.rb +195 -0
  392. data/lib/studium/exams/autoinclude.rb +7 -0
  393. data/lib/studium/exams/csv/create_csv_passed_exams_file.rb +217 -0
  394. data/lib/studium/exams/cycle.rb +291 -0
  395. data/lib/studium/exams/dataset.rb +123 -0
  396. data/lib/studium/exams/designate_ten_random_exam_topics/designate_ten_random_exam_topics.rb +88 -0
  397. data/lib/studium/exams/exam/exam.rb +130 -0
  398. data/lib/studium/exams/exam_question/README.md +3 -0
  399. data/lib/studium/exams/exam_question/answer.rb +177 -0
  400. data/lib/studium/exams/exam_question/constants.rb +111 -0
  401. data/lib/studium/exams/exam_question/exam_question.rb +1135 -0
  402. data/lib/studium/exams/exam_question/menu.rb +333 -0
  403. data/lib/studium/exams/exam_question/misc.rb +895 -0
  404. data/lib/studium/exams/exam_question/question.rb +91 -0
  405. data/lib/studium/exams/exam_question/reset.rb +96 -0
  406. data/lib/studium/exams/exam_registration_at/constants.rb +49 -0
  407. data/lib/studium/exams/exam_registration_at/exam_registration_at.rb +242 -0
  408. data/lib/studium/exams/exam_registration_at/help.rb +46 -0
  409. data/lib/studium/exams/exam_registration_at/menu.rb +81 -0
  410. data/lib/studium/exams/exam_registration_at/report_and_show.rb +133 -0
  411. data/lib/studium/exams/exam_registration_at/reset.rb +54 -0
  412. data/lib/studium/exams/exam_statistics_from_this_file/exam_statistics_from_this_file.rb +119 -0
  413. data/lib/studium/exams/exam_topics.rb +194 -0
  414. data/lib/studium/exams/exams.rb +20 -0
  415. data/lib/studium/exams/exams_per_month/exams_per_month.rb +2438 -0
  416. data/lib/studium/exams/exams_this_week.rb +182 -0
  417. data/lib/studium/exams/fix_exam_dates.rb +121 -0
  418. data/lib/studium/exams/frozen.rb +36 -0
  419. data/lib/studium/exams/last_exams/last_exams.rb +398 -0
  420. data/lib/studium/exams/lectures_without_exam_entry.rb +137 -0
  421. data/lib/studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb +1956 -0
  422. 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
  423. data/lib/studium/exams/n_exams_in_these_topics.rb +404 -0
  424. data/lib/studium/exams/next_exam.rb +107 -0
  425. data/lib/studium/exams/next_exams.rb +378 -0
  426. data/lib/studium/exams/open_exam_associated_url.rb +154 -0
  427. data/lib/studium/exams/open_last_exam_question_asked_file/constants.rb +15 -0
  428. data/lib/studium/exams/open_last_exam_question_asked_file/initialize.rb +29 -0
  429. data/lib/studium/exams/open_last_exam_question_asked_file/open_last_exam_question_asked_file.rb +109 -0
  430. data/lib/studium/exams/pr/303/274fung.rb +289 -0
  431. data/lib/studium/exams/push_solved_questions_on_top.rb +180 -0
  432. data/lib/studium/exams/questions_solved_from_day_to_day/questions_solved_from_day_to_day.rb +377 -0
  433. data/lib/studium/exams/remote_ftp_url.rb +52 -0
  434. data/lib/studium/exams/repeat_last_question.rb +78 -0
  435. data/lib/studium/exams/show_all_passed_exams_of_this_university.rb +252 -0
  436. data/lib/studium/exams/show_backlog_of_exams.rb +117 -0
  437. data/lib/studium/exams/show_next_exams_for.rb +133 -0
  438. data/lib/studium/exams/show_themes/constants.rb +28 -0
  439. data/lib/studium/exams/show_themes/menu.rb +61 -0
  440. data/lib/studium/exams/show_themes/misc.rb +537 -0
  441. data/lib/studium/exams/show_themes/reset.rb +62 -0
  442. data/lib/studium/exams/show_themes/show_themes.rb +27 -0
  443. data/lib/studium/exams/show_upcoming_exams/consider_autogenerating_exam_aliases.rb +181 -0
  444. data/lib/studium/exams/show_upcoming_exams/constants.rb +82 -0
  445. data/lib/studium/exams/show_upcoming_exams/help.rb +33 -0
  446. data/lib/studium/exams/show_upcoming_exams/initialize.rb +77 -0
  447. data/lib/studium/exams/show_upcoming_exams/menu.rb +60 -0
  448. data/lib/studium/exams/show_upcoming_exams/report.rb +200 -0
  449. data/lib/studium/exams/show_upcoming_exams/reset.rb +45 -0
  450. data/lib/studium/exams/show_upcoming_exams/run.rb +20 -0
  451. data/lib/studium/exams/show_upcoming_exams/show_upcoming_exams.rb +544 -0
  452. data/lib/studium/exams/solve_all_questions_from_this_topic.rb +114 -0
  453. data/lib/studium/exams/solved/constants.rb +32 -0
  454. data/lib/studium/exams/solved/help.rb +24 -0
  455. data/lib/studium/exams/solved/initialize.rb +55 -0
  456. data/lib/studium/exams/solved/menu.rb +41 -0
  457. data/lib/studium/exams/solved/reset.rb +28 -0
  458. data/lib/studium/exams/solved/solved.rb +313 -0
  459. data/lib/studium/exams/unsolve_all_questions_from_this_topic.rb +162 -0
  460. data/lib/studium/exams/upcoming_exams/constants.rb +15 -0
  461. data/lib/studium/exams/upcoming_exams/help.rb +41 -0
  462. data/lib/studium/exams/upcoming_exams/initialize.rb +27 -0
  463. data/lib/studium/exams/upcoming_exams/menu.rb +79 -0
  464. data/lib/studium/exams/upcoming_exams/misc.rb +415 -0
  465. data/lib/studium/exams/upcoming_exams/reset.rb +34 -0
  466. data/lib/studium/exams/upcoming_exams/run.rb +26 -0
  467. data/lib/studium/exams/upcoming_exams/upcoming_exams.rb +32 -0
  468. data/lib/studium/exams/upcoming_exams_at_the_boku/constants.rb +23 -0
  469. data/lib/studium/exams/upcoming_exams_at_the_boku/html.rb +64 -0
  470. data/lib/studium/exams/upcoming_exams_at_the_boku/upcoming_exams_at_the_boku.rb +194 -0
  471. data/lib/studium/exams/upcoming_exams_dataset.rb +247 -0
  472. data/lib/studium/exams/upload_exam_topics.rb +360 -0
  473. data/lib/studium/graphviz/README.md +4 -0
  474. data/lib/studium/graphviz/bachelor_vector_based_strategies.dot +160 -0
  475. data/lib/studium/graphviz/master_vector_based_strategies.dot +46 -0
  476. data/lib/studium/gui/gtk3/README.md +1 -0
  477. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.config +6 -0
  478. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.rb +760 -0
  479. data/lib/studium/gui/gtk3/ask_exam_question/manifest.yml +12 -0
  480. data/lib/studium/gui/gtk3/control_panel/control_panel.rb +39 -0
  481. data/lib/studium/gui/gtk3/curriculum_viewer/curriculum_viewer.rb +510 -0
  482. data/lib/studium/gui/gtk3/ects_per_university/ects_per_university.rb +217 -0
  483. data/lib/studium/gui/gtk3/exam_question_widget/exam_question_widget.rb +1887 -0
  484. data/lib/studium/gui/gtk3/expand_time_range/expand_time_range.rb +34 -0
  485. data/lib/studium/gui/gtk3/information_about_a_lecture/information_about_a_lecture.rb +34 -0
  486. data/lib/studium/gui/gtk3/lecture_information/lecture_information.rb +200 -0
  487. data/lib/studium/gui/gtk3/show_upcoming_exams/show_upcoming_exams.rb +34 -0
  488. data/lib/studium/gui/java/exam_question/ExamQuestion$1.class +0 -0
  489. data/lib/studium/gui/java/exam_question/ExamQuestion.class +0 -0
  490. data/lib/studium/gui/java/exam_question/ExamQuestion.java +215 -0
  491. data/lib/studium/gui/javafx/exam_question_widget/exam_question_widget.rb +58 -0
  492. data/lib/studium/gui/jruby/exam_question_widget/exam_question_widget.rb +317 -0
  493. data/lib/studium/gui/libui/ask_exam_question/ask_exam_question.rb +349 -0
  494. data/lib/studium/gui/shared_code/control_panel/control_panel_module.rb +314 -0
  495. data/lib/studium/gui/shared_code/exam_question_widget/exam_question_widget_module.rb +39 -0
  496. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range.css +0 -0
  497. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range_module.rb +190 -0
  498. data/lib/studium/gui/shared_code/information_about_a_lecture/information_about_a_lecture_module.rb +180 -0
  499. data/lib/studium/gui/shared_code/show_upcoming_exams/show_upcoming_exams_module.rb +206 -0
  500. data/lib/studium/images/libui_ask_exam_question.png +0 -0
  501. data/lib/studium/images/small_logos/DNA.png +0 -0
  502. data/lib/studium/images/small_logos/README.md +2 -0
  503. data/lib/studium/images/studies_favicon.png +0 -0
  504. data/lib/studium/java/Mkdir.java +15 -0
  505. data/lib/studium/java/README.md +2 -0
  506. data/lib/studium/java/ask_exam_question/AskExamQuestion.java +477 -0
  507. data/lib/studium/java/solved/Solved.class +0 -0
  508. data/lib/studium/java/solved/Solved.java +110 -0
  509. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.class +0 -0
  510. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.java +80 -0
  511. data/lib/studium/logging/README.md +2 -0
  512. data/lib/studium/logging/ensure_that_the_log_directory_exists.rb +47 -0
  513. data/lib/studium/logging/html_log_directory.rb +41 -0
  514. data/lib/studium/logging/log_directory.rb +112 -0
  515. data/lib/studium/logging/store_last_question_asked_into_file.rb +137 -0
  516. data/lib/studium/parsers/README.md +2 -0
  517. data/lib/studium/parsers/custom_exam_results_parser.rb +206 -0
  518. data/lib/studium/parsers/parse_lva_dates.rb +190 -0
  519. data/lib/studium/parsers/parse_remote_lecture.rb +325 -0
  520. data/lib/studium/project/project.rb +76 -0
  521. data/lib/studium/requires/common_popular_requires.rb +37 -0
  522. data/lib/studium/requires/commonly_used_requires.rb +14 -0
  523. data/lib/studium/requires/require_class_exams_solved.rb +7 -0
  524. data/lib/studium/requires/require_ects_scripts.rb +27 -0
  525. data/lib/studium/requires/require_encoding.rb +7 -0
  526. data/lib/studium/requires/require_the_check_and_sanitize_files.rb +31 -0
  527. data/lib/studium/requires/require_the_curricula_files.rb +28 -0
  528. data/lib/studium/requires/require_the_exam_question_class.rb +7 -0
  529. data/lib/studium/requires/require_the_exams_files.rb +45 -0
  530. data/lib/studium/requires/require_the_logging_files.rb +23 -0
  531. data/lib/studium/requires/require_the_parsers.rb +28 -0
  532. data/lib/studium/requires/require_the_studium_constants.rb +10 -0
  533. data/lib/studium/requires/require_the_studium_project.rb +54 -0
  534. data/lib/studium/requires/require_the_toplevel_methods.rb +27 -0
  535. data/lib/studium/requires/require_the_utility_scripts.rb +49 -0
  536. data/lib/studium/requires/require_upcoming_exams.rb +7 -0
  537. data/lib/studium/requires/require_yaml.rb +7 -0
  538. data/lib/studium/requires/return_remote_homepage_of_this_lecture.rb +7 -0
  539. data/lib/studium/requires/with_GUI.rb +13 -0
  540. data/lib/studium/requires/www_mode.rb +17 -0
  541. data/lib/studium/statistics/README.md +4 -0
  542. data/lib/studium/statistics/best_exam_months.rb +92 -0
  543. data/lib/studium/statistics/curriculum_comparer.rb +336 -0
  544. data/lib/studium/statistics/determine_exam_statistics_from_this_file.rb +142 -0
  545. data/lib/studium/statistics/exam_topics_that_are_about_to_be_completed.rb +119 -0
  546. data/lib/studium/statistics/max_stats.rb +170 -0
  547. data/lib/studium/statistics/new_questions_per_year.rb +147 -0
  548. data/lib/studium/statistics/report_how_many_ects_points_per_curriculum_were_completed.rb +167 -0
  549. data/lib/studium/statistics/report_how_many_exam_questions_were_answered.rb +473 -0
  550. data/lib/studium/statistics/show_exam_statistics.rb +60 -0
  551. data/lib/studium/statistics/show_which_courses_are_in_a_bachelor_or_master_curriculum_respectively.rb +104 -0
  552. data/lib/studium/statistics/top_stats.rb +127 -0
  553. data/lib/studium/toplevel_methods/all_passed_exams.rb +37 -0
  554. data/lib/studium/toplevel_methods/already_solved_this_lecture.rb +100 -0
  555. data/lib/studium/toplevel_methods/available_topics.rb +156 -0
  556. data/lib/studium/toplevel_methods/average_grade.rb +141 -0
  557. data/lib/studium/toplevel_methods/calculate_pr/303/274fungsimmanente_lectures_from_this_file.rb +55 -0
  558. data/lib/studium/toplevel_methods/copy_the_last_backup_of_file_lecture_information.rb +34 -0
  559. data/lib/studium/toplevel_methods/curriculum_related_code.rb +999 -0
  560. data/lib/studium/toplevel_methods/determine_local_directory_of_this_lecture.rb +72 -0
  561. data/lib/studium/toplevel_methods/does_this_course_require_mandatory_presence.rb +51 -0
  562. data/lib/studium/toplevel_methods/download.rb +163 -0
  563. data/lib/studium/toplevel_methods/e.rb +16 -0
  564. data/lib/studium/toplevel_methods/ects_from_lectures.rb +250 -0
  565. data/lib/studium/toplevel_methods/editor.rb +65 -0
  566. data/lib/studium/toplevel_methods/esystem.rb +22 -0
  567. data/lib/studium/toplevel_methods/filter_away_invalid_questions.rb +77 -0
  568. data/lib/studium/toplevel_methods/find_exam_topic_and_exam_title.rb +3442 -0
  569. data/lib/studium/toplevel_methods/handle_archive_of_the_exam_questions.rb +136 -0
  570. data/lib/studium/toplevel_methods/has_this_lecture_been_already_passed_but_the_id_was_changed_lateron.rb +42 -0
  571. data/lib/studium/toplevel_methods/has_this_module_been_completed.rb +206 -0
  572. data/lib/studium/toplevel_methods/install_the_project_on_the_given_hostsystem.rb +32 -0
  573. data/lib/studium/toplevel_methods/is_on_roebe.rb +26 -0
  574. data/lib/studium/toplevel_methods/is_this_exam_topic_included.rb +46 -0
  575. data/lib/studium/toplevel_methods/is_this_homepage_registered.rb +31 -0
  576. data/lib/studium/toplevel_methods/is_this_lecture_a_practical_course.rb +100 -0
  577. data/lib/studium/toplevel_methods/is_this_lecture_registered_in_upcoming_exams.rb +42 -0
  578. data/lib/studium/toplevel_methods/java.rb +32 -0
  579. data/lib/studium/toplevel_methods/lecture_information.rb +106 -0
  580. data/lib/studium/toplevel_methods/lva_numbers.rb +355 -0
  581. data/lib/studium/toplevel_methods/main_dataset.rb +73 -0
  582. data/lib/studium/toplevel_methods/methods_related_to_directories.rb +225 -0
  583. data/lib/studium/toplevel_methods/methods_related_to_files.rb +205 -0
  584. data/lib/studium/toplevel_methods/misc.rb +169 -0
  585. data/lib/studium/toplevel_methods/n_questions_available.rb +137 -0
  586. data/lib/studium/toplevel_methods/n_topics_available.rb +63 -0
  587. data/lib/studium/toplevel_methods/names_of_all_solved_exams.rb +71 -0
  588. data/lib/studium/toplevel_methods/note_down_the_start_time_and_how_many_exams_have_been_already_solved.rb +69 -0
  589. data/lib/studium/toplevel_methods/opnn.rb +25 -0
  590. data/lib/studium/toplevel_methods/passed_this_exam_on.rb +105 -0
  591. data/lib/studium/toplevel_methods/pristine.rb +69 -0
  592. data/lib/studium/toplevel_methods/read_delay_between_questions_from_file.rb +34 -0
  593. data/lib/studium/toplevel_methods/regexes.rb +90 -0
  594. data/lib/studium/toplevel_methods/registered_for_this_exam.rb +62 -0
  595. data/lib/studium/toplevel_methods/remove_comments.rb +26 -0
  596. data/lib/studium/toplevel_methods/remove_exam_topics_that_were_already_answered.rb +27 -0
  597. data/lib/studium/toplevel_methods/remove_tags.rb +32 -0
  598. data/lib/studium/toplevel_methods/report.rb +419 -0
  599. data/lib/studium/toplevel_methods/return_all_exams_on_this_day.rb +66 -0
  600. data/lib/studium/toplevel_methods/return_dataset_for_this_exam_topic.rb +41 -0
  601. data/lib/studium/toplevel_methods/return_div_timetable_of_upcoming_exams.rb +498 -0
  602. data/lib/studium/toplevel_methods/return_ects_from_this_lecture_stored_in_the_file_lecture_information.rb +194 -0
  603. data/lib/studium/toplevel_methods/return_hash_of_already_solved_lectures.rb +46 -0
  604. data/lib/studium/toplevel_methods/return_last_exam_question.rb +34 -0
  605. data/lib/studium/toplevel_methods/return_local_path_of_this_pwdstud.rb +60 -0
  606. data/lib/studium/toplevel_methods/return_lva_number_of_this_lecture.rb +72 -0
  607. data/lib/studium/toplevel_methods/return_n_percent_solved_from_this_topic.rb +90 -0
  608. data/lib/studium/toplevel_methods/return_n_questions_were_answered_for_this_topic.rb +60 -0
  609. data/lib/studium/toplevel_methods/return_proper_university_image.rb +86 -0
  610. data/lib/studium/toplevel_methods/return_question_answer_string_from_this_topic.rb +63 -0
  611. data/lib/studium/toplevel_methods/return_remote_homepage_of_this_lecture.rb +9400 -0
  612. data/lib/studium/toplevel_methods/return_remote_moodle_link_of_this_lecture.rb +1661 -0
  613. data/lib/studium/toplevel_methods/return_sanitized_dataset_from_the_file_lecture_information.rb +110 -0
  614. data/lib/studium/toplevel_methods/return_theme_of_the_next_upcoming_exam.rb +38 -0
  615. data/lib/studium/toplevel_methods/rinstall2.rb +34 -0
  616. data/lib/studium/toplevel_methods/rti_conflict.rb +35 -0
  617. data/lib/studium/toplevel_methods/runmode.rb +87 -0
  618. data/lib/studium/toplevel_methods/sanitized_dataset_from_file_passed_exams_per_month.rb +52 -0
  619. data/lib/studium/toplevel_methods/set_last_file_for_exam_questions.rb +64 -0
  620. data/lib/studium/toplevel_methods/set_this_cd_alias_to.rb +86 -0
  621. data/lib/studium/toplevel_methods/show_passed_exams_having_this_grade.rb +34 -0
  622. data/lib/studium/toplevel_methods/spacer.rb +18 -0
  623. data/lib/studium/toplevel_methods/time.rb +239 -0
  624. data/lib/studium/toplevel_methods/total_ects_points_passed.rb +72 -0
  625. data/lib/studium/toplevel_methods/try_to_guess_the_most_likely_lva_id.rb +57 -0
  626. data/lib/studium/toplevel_methods/try_to_return_the_expanded_name_of_this_lecture.rb +63 -0
  627. data/lib/studium/toplevel_methods/unfinished.rb +51 -0
  628. data/lib/studium/toplevel_methods/url.rb +100 -0
  629. data/lib/studium/toplevel_methods/verbose_truth.rb +36 -0
  630. data/lib/studium/toplevel_methods/when_was_this_lecture_passed.rb +54 -0
  631. data/lib/studium/toplevel_methods/word_wrap.rb +56 -0
  632. data/lib/studium/toplevel_methods/write_into_file_related_functionality.rb +189 -0
  633. data/lib/studium/toplevel_methods/yes_or_no_ja_oder_nein.rb +33 -0
  634. data/lib/studium/universities_in_austria/README.md +2 -0
  635. data/lib/studium/universities_in_austria/boku/README.md +4 -0
  636. data/lib/studium/universities_in_austria/boku/boku_/303/266ffnungszeiten.rb +28 -0
  637. data/lib/studium/universities_in_austria/boku/show_three_pillars_of_these_lectures.rb +110 -0
  638. data/lib/studium/universities_in_austria/boku/three_pillars.rb +237 -0
  639. data/lib/studium/universities_in_austria/tu_vienna/README.md +6 -0
  640. data/lib/studium/universities_in_austria/tu_vienna/tu_ferien.rb +42 -0
  641. data/lib/studium/universities_in_austria/tu_vienna/tu_/303/266ffnungszeiten.rb +34 -0
  642. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_boku_lecture_to_curriculum.rb +384 -0
  643. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_lecture_to_curriculum.rb +238 -0
  644. data/lib/studium/utility_scripts/attribute_lectures_to_university/attribute_lectures_to_university.rb +375 -0
  645. data/lib/studium/utility_scripts/audio_stats.rb +171 -0
  646. data/lib/studium/utility_scripts/auto_stud/auto_stud.rb +252 -0
  647. data/lib/studium/utility_scripts/auto_stud/constants.rb +18 -0
  648. data/lib/studium/utility_scripts/auto_stud/initialize.rb +23 -0
  649. data/lib/studium/utility_scripts/auto_stud/misc.rb +18 -0
  650. data/lib/studium/utility_scripts/autopurge_this_lecture_date.rb +93 -0
  651. data/lib/studium/utility_scripts/average_grade_of_this_curriculum.rb +101 -0
  652. data/lib/studium/utility_scripts/calendar/README.md +2 -0
  653. data/lib/studium/utility_scripts/calendar/calendar.rb +251 -0
  654. data/lib/studium/utility_scripts/calendar/misc.rb +35 -0
  655. data/lib/studium/utility_scripts/check_description_of_these_lectures.rb +221 -0
  656. data/lib/studium/utility_scripts/create_database/create_database.rb +106 -0
  657. data/lib/studium/utility_scripts/current_lectures_belonging_to_both_bachelor_and_master_curriculum.rb +113 -0
  658. data/lib/studium/utility_scripts/currently_participating_in_these_lectures/currently_participating_in_these_lectures.rb +104 -0
  659. data/lib/studium/utility_scripts/display_lecture_url.rb +160 -0
  660. data/lib/studium/utility_scripts/expand_time_range/expand_time_range.rb +414 -0
  661. data/lib/studium/utility_scripts/finished_exams_at_this_university.rb +94 -0
  662. data/lib/studium/utility_scripts/foreign_language_percentage/constants.rb +23 -0
  663. data/lib/studium/utility_scripts/foreign_language_percentage/foreign_language_percentage.rb +149 -0
  664. data/lib/studium/utility_scripts/foreign_language_percentage/help.rb +31 -0
  665. data/lib/studium/utility_scripts/foreign_language_percentage/initialize.rb +25 -0
  666. data/lib/studium/utility_scripts/foreign_language_percentage/menu.rb +158 -0
  667. data/lib/studium/utility_scripts/foreign_language_percentage/report.rb +62 -0
  668. data/lib/studium/utility_scripts/foreign_language_percentage/reset.rb +50 -0
  669. data/lib/studium/utility_scripts/foreign_language_percentage/run.rb +19 -0
  670. data/lib/studium/utility_scripts/generate_spreadsheet/generate_spreadsheet.rb +354 -0
  671. data/lib/studium/utility_scripts/generate_spreadsheet/misc.rb +144 -0
  672. data/lib/studium/utility_scripts/holidays/holidays.rb +150 -0
  673. data/lib/studium/utility_scripts/homepage_of_these_courses.rb +118 -0
  674. data/lib/studium/utility_scripts/lecture_downloader.rb +107 -0
  675. data/lib/studium/utility_scripts/lectures_attributed_to_universities.rb +336 -0
  676. data/lib/studium/utility_scripts/lva_dates_of_the_important_courses.rb +111 -0
  677. data/lib/studium/utility_scripts/lva_nummer.rb +431 -0
  678. data/lib/studium/utility_scripts/mandatory_lectures_in_this_month/mandatory_lectures_in_this_month.rb +316 -0
  679. data/lib/studium/utility_scripts/name_of_this_lva_id.rb +110 -0
  680. data/lib/studium/utility_scripts/new_stud.rb +324 -0
  681. data/lib/studium/utility_scripts/next_week.rb +103 -0
  682. data/lib/studium/utility_scripts/open_last_exam_question_url_link_via_the_browser.rb +76 -0
  683. data/lib/studium/utility_scripts/passed_ects_per_year/passed_ects_per_year.rb +177 -0
  684. data/lib/studium/utility_scripts/passed_pr/303/274fungsimmanente_courses/passed_pr/303/274fungsimmanente_courses.rb +181 -0
  685. data/lib/studium/utility_scripts/pdf/README.md +2 -0
  686. data/lib/studium/utility_scripts/pdf/create_pdf_file_for_this_exam_topic.rb +355 -0
  687. data/lib/studium/utility_scripts/pdf/hexapdf_support.rb +50 -0
  688. data/lib/studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb +312 -0
  689. data/lib/studium/utility_scripts/priority.rb +164 -0
  690. data/lib/studium/utility_scripts/priority_points/priority_points.rb +263 -0
  691. data/lib/studium/utility_scripts/publish_my_exams.rb +174 -0
  692. data/lib/studium/utility_scripts/regexes/README.md +1 -0
  693. data/lib/studium/utility_scripts/regexes/generate_regex.rb +300 -0
  694. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_available_moodle_links.rb +55 -0
  695. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_registered_lectures.rb +48 -0
  696. data/lib/studium/utility_scripts/report_outdated_timetable_entries/report_outdated_timetable_entries.rb +142 -0
  697. data/lib/studium/utility_scripts/report_total_amount_of_questions_and_answers_for.rb +116 -0
  698. data/lib/studium/utility_scripts/report_whether_this_lecture_is_registered_in_the_file_lecture_information.rb +128 -0
  699. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/individual_resolve_practical_courses_date_conflicts.rb +254 -0
  700. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/resolve_practical_courses_date_conflicts.rb +265 -0
  701. data/lib/studium/utility_scripts/scrape_remote_university_url.rb +138 -0
  702. data/lib/studium/utility_scripts/semester_schedule_creator/semester_container.rb +144 -0
  703. data/lib/studium/utility_scripts/semester_schedule_creator/semester_schedule_creator.rb +374 -0
  704. data/lib/studium/utility_scripts/semesterplaner.rb +289 -0
  705. data/lib/studium/utility_scripts/set_aliases_based_on_this_file.rb +95 -0
  706. data/lib/studium/utility_scripts/show_all_passed_master_lectures.rb +119 -0
  707. data/lib/studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb +1238 -0
  708. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/constants.rb +23 -0
  709. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/menu.rb +63 -0
  710. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/reset.rb +33 -0
  711. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/run.rb +50 -0
  712. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/show_descriptions_of_lectures_belonging_to_this_module.rb +145 -0
  713. data/lib/studium/utility_scripts/show_lecturers/show_lecturers.rb +147 -0
  714. data/lib/studium/utility_scripts/show_lectures/constants.rb +11 -0
  715. data/lib/studium/utility_scripts/show_lectures/help.rb +34 -0
  716. data/lib/studium/utility_scripts/show_lectures/initialize.rb +23 -0
  717. data/lib/studium/utility_scripts/show_lectures/menu.rb +127 -0
  718. data/lib/studium/utility_scripts/show_lectures/misc.rb +584 -0
  719. data/lib/studium/utility_scripts/show_lectures/reset.rb +89 -0
  720. data/lib/studium/utility_scripts/show_lectures/run.rb +27 -0
  721. data/lib/studium/utility_scripts/show_lectures/show_lectures.rb +48 -0
  722. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_language/show_lectures_fitting_to_this_language.rb +121 -0
  723. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_theme/show_lectures_fitting_to_this_theme.rb +105 -0
  724. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/constants.rb +17 -0
  725. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/determine.rb +673 -0
  726. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/help.rb +44 -0
  727. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/html.rb +605 -0
  728. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/initialize.rb +56 -0
  729. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/konsole.rb +32 -0
  730. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/menu.rb +472 -0
  731. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/misc.rb +837 -0
  732. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/reset.rb +121 -0
  733. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/run.rb +44 -0
  734. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show.rb +106 -0
  735. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb +261 -0
  736. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/sorted_individual_curricula.rb +121 -0
  737. data/lib/studium/utility_scripts/show_lectures_on_this_day.rb +149 -0
  738. data/lib/studium/utility_scripts/show_lva_dates_of_this_lecture.rb +169 -0
  739. data/lib/studium/utility_scripts/show_mixed_bachelor_master_courses/show_mixed_bachelor_master_courses.rb +91 -0
  740. data/lib/studium/utility_scripts/show_outdated_lva_dates/show_outdated_lva_dates.rb +210 -0
  741. data/lib/studium/utility_scripts/show_solved_english_lectures/show_solved_english_lectures.rb +139 -0
  742. data/lib/studium/utility_scripts/steop/README.md +4 -0
  743. data/lib/studium/utility_scripts/steop/show_all_steop_lectures.rb +93 -0
  744. data/lib/studium/utility_scripts/steop/steop_lectures_in_this_curriculum.rb +284 -0
  745. data/lib/studium/utility_scripts/steop/steop_lva_dates.rb +119 -0
  746. data/lib/studium/utility_scripts/studienkennzahl.rb +116 -0
  747. data/lib/studium/utility_scripts/studium_skeleton/studium_skeleton.rb +227 -0
  748. data/lib/studium/utility_scripts/stundenplan.rb +595 -0
  749. data/lib/studium/utility_scripts/sync_studium_relevant_entries_one_level_downwards.rb +217 -0
  750. data/lib/studium/utility_scripts/ufind/ufind.rb +98 -0
  751. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/constants.rb +26 -0
  752. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/run.rb +20 -0
  753. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/upcoming_mandatory_presence_courses.rb +181 -0
  754. data/lib/studium/utility_scripts/week_parser/constants.rb +23 -0
  755. data/lib/studium/utility_scripts/week_parser/help.rb +32 -0
  756. data/lib/studium/utility_scripts/week_parser/menu.rb +59 -0
  757. data/lib/studium/utility_scripts/week_parser/misc.rb +373 -0
  758. data/lib/studium/utility_scripts/week_parser/reset.rb +65 -0
  759. data/lib/studium/utility_scripts/week_parser/run.rb +18 -0
  760. data/lib/studium/utility_scripts/week_parser/show.rb +236 -0
  761. data/lib/studium/utility_scripts/week_parser/week_parser.rb +49 -0
  762. data/lib/studium/utility_scripts/weekday_parser.rb +155 -0
  763. data/lib/studium/utility_scripts/weekly_schedule.rb +198 -0
  764. data/lib/studium/utility_scripts/wochenplanung.rb +261 -0
  765. data/lib/studium/version/version.rb +46 -0
  766. data/lib/studium/www/curricula_displayer.cgi +197 -0
  767. data/lib/studium/www/curriculum_displayer.rb +162 -0
  768. data/lib/studium/www/exams.cgi +53 -0
  769. data/lib/studium/www/fast_ask_exam_question.cgi +155 -0
  770. data/lib/studium/www/sinatra/app.rb +231 -0
  771. data/lib/studium/www/sinatra/misc.rb +115 -0
  772. data/lib/studium/www/statistics/statistics.cgi +59 -0
  773. data/lib/studium/yaml/ad_hoc_trainer/README.md +2 -0
  774. data/lib/studium/yaml/ad_hoc_trainer/exam_topics.md +15 -0
  775. data/lib/studium/yaml/allowed_themes_for_exams.yml +344 -0
  776. data/lib/studium/yaml/array_allowed_entries_for_the_file_lecture_information.yml +70 -0
  777. data/lib/studium/yaml/available_exam_topics/available_exam_topics.yml +234 -0
  778. data/lib/studium/yaml/backlog_of_exams.yml +37 -0
  779. data/lib/studium/yaml/colours/custom_colours.yml +28 -0
  780. data/lib/studium/yaml/colours/use_colours.yml +1 -0
  781. data/lib/studium/yaml/current_exams.yml +19 -0
  782. data/lib/studium/yaml/curricula/README.md +9 -0
  783. data/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml +142 -0
  784. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml +65 -0
  785. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_botanik_033630.yml +84 -0
  786. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_ecology_033630.yml +74 -0
  787. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml +120 -0
  788. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_molekulare_biologie_033630.yml +104 -0
  789. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_zoologie_033630.yml +87 -0
  790. data/lib/studium/yaml/curricula/bachelor/bachelor_chemie_033662.yml +165 -0
  791. data/lib/studium/yaml/curricula/bachelor/bachelor_dummy_curriculum.yml +183 -0
  792. data/lib/studium/yaml/curricula/bachelor/bachelor_elektrotechnik_und_informationstechnik_033235.yml +13 -0
  793. data/lib/studium/yaml/curricula/bachelor/bachelor_forstwirtschaft_033225.yml +115 -0
  794. data/lib/studium/yaml/curricula/bachelor/bachelor_informatik_033521.yml +130 -0
  795. data/lib/studium/yaml/curricula/bachelor/bachelor_ktww_033231.yml +84 -0
  796. data/lib/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml +118 -0
  797. data/lib/studium/yaml/curricula/bachelor/bachelor_medizinische_informatik_033533.yml +203 -0
  798. data/lib/studium/yaml/curricula/bachelor/bachelor_molekularbiologie_033665.yml +95 -0
  799. data/lib/studium/yaml/curricula/bachelor/bachelor_nutrition_science_033638.yml +119 -0
  800. data/lib/studium/yaml/curricula/bachelor/bachelor_pharmazie_033305.yml +170 -0
  801. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_chemie_033290.yml +129 -0
  802. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_informatik_033535.yml +23 -0
  803. data/lib/studium/yaml/curricula/bachelor/bachelor_ubrm_033227.yml +136 -0
  804. data/lib/studium/yaml/curricula/bachelor/bachelor_verfahrenstechnik_033273.yml +167 -0
  805. data/lib/studium/yaml/curricula/bachelor/bachelor_wirtschaftsinformatik_033526.yml +29 -0
  806. data/lib/studium/yaml/curricula/individual/bachelor_informatik_und_molekulare_biologie.yml +1161 -0
  807. data/lib/studium/yaml/curricula/individual/bachelor_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +1157 -0
  808. data/lib/studium/yaml/curricula/individual/master_bioinformatics_and_nanobiotechnology_in_molecular_medicine.yml +306 -0
  809. data/lib/studium/yaml/curricula/individual/master_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +741 -0
  810. data/lib/studium/yaml/curricula/master/master_bioinformatik_066875.yml +76 -0
  811. data/lib/studium/yaml/curricula/master/master_biologie_molekulare_mikrobiologie_mikrobielle_oekologie_und_immunbiologie_066830.yml +78 -0
  812. data/lib/studium/yaml/curricula/master/master_biologische_chemie_066863.yml +61 -0
  813. data/lib/studium/yaml/curricula/master/master_dummy_curriculum.yml +197 -0
  814. data/lib/studium/yaml/curricula/master/master_genetik_und_entwicklungsbiologie_066877.yml +89 -0
  815. data/lib/studium/yaml/curricula/master/master_lmbt_066418.yml +111 -0
  816. data/lib/studium/yaml/curricula/master/master_molekulare_biologie_066834.yml +142 -0
  817. data/lib/studium/yaml/curricula/master/master_pharmazie_066605.yml +170 -0
  818. data/lib/studium/yaml/curricula/master/master_technische_chemie_066490.yml +123 -0
  819. data/lib/studium/yaml/curricula/outdated/master_bioinformatics_and_molecular_biotechnology_including_aspects_from_molecular_medicine.yml +438 -0
  820. data/lib/studium/yaml/curricula/outdated/master_food_science_and_plant_biotechnology.yml +31 -0
  821. data/lib/studium/yaml/curricula.yml +538 -0
  822. data/lib/studium/yaml/daily_questions_solved.yml +1468 -0
  823. data/lib/studium/yaml/default_delay.yml +4 -0
  824. data/lib/studium/yaml/default_encoding.yml +1 -0
  825. data/lib/studium/yaml/directory_to_the_exam_topics.yml +0 -0
  826. data/lib/studium/yaml/editor.yml +1 -0
  827. data/lib/studium/yaml/file_for_exam_questions.yml +1 -0
  828. data/lib/studium/yaml/german/README.md +2 -0
  829. data/lib/studium/yaml/german/german_to_english_month_names.yml +16 -0
  830. data/lib/studium/yaml/grouped_themes.yml +192 -0
  831. data/lib/studium/yaml/holidays.yml +194 -0
  832. data/lib/studium/yaml/important_exams.yml +226 -0
  833. data/lib/studium/yaml/inscription_dates_of_universities.yml +60 -0
  834. data/lib/studium/yaml/lecture_aliases.yml +138 -0
  835. data/lib/studium/yaml/lecture_information/lecture_information.yml +55870 -0
  836. data/lib/studium/yaml/log_dir.yml +1 -0
  837. data/lib/studium/yaml/main_topic.yml +11 -0
  838. data/lib/studium/yaml/max_stats.yml +241 -0
  839. data/lib/studium/yaml/meta_themes/README.md +13 -0
  840. data/lib/studium/yaml/meta_themes/biochemistry.md +6 -0
  841. data/lib/studium/yaml/meta_themes/bioinformatics.md +6 -0
  842. data/lib/studium/yaml/meta_themes/biotechnology.md +9 -0
  843. data/lib/studium/yaml/meta_themes/chemistry.md +9 -0
  844. data/lib/studium/yaml/meta_themes/genetics.md +10 -0
  845. data/lib/studium/yaml/meta_themes/immunology.md +5 -0
  846. data/lib/studium/yaml/meta_themes/metabolic_pathways.md +12 -0
  847. data/lib/studium/yaml/meta_themes/molecular_biology.md +9 -0
  848. data/lib/studium/yaml/meta_themes/protein_engineering.md +10 -0
  849. data/lib/studium/yaml/meta_themes/statistics.md +2 -0
  850. data/lib/studium/yaml/mitbelegung/README.md +4 -0
  851. data/lib/studium/yaml/mitbelegung/mitbelegung.yml +23 -0
  852. data/lib/studium/yaml/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.yml +363 -0
  853. data/lib/studium/yaml/n_total_questions.yml +1 -0
  854. data/lib/studium/yaml/rename_konsole_tab.yml +1 -0
  855. data/lib/studium/yaml/show_topic.yml +1 -0
  856. data/lib/studium/yaml/statistics/max_stats.yml +239 -0
  857. data/lib/studium/yaml/statistics/statistics.yml +69 -0
  858. data/lib/studium/yaml/week/01_monday.yml +5 -0
  859. data/lib/studium/yaml/week/02_tuesday.yml +75 -0
  860. data/lib/studium/yaml/week/03_wednesday.yml +62 -0
  861. data/lib/studium/yaml/week/04_thursday.yml +14 -0
  862. data/lib/studium/yaml/week/05_friday.yml +31 -0
  863. data/lib/studium/yaml/week/06_saturday.yml +16 -0
  864. data/lib/studium/yaml/week/07_sunday.yml +0 -0
  865. data/lib/studium/yaml/week/README.md +13 -0
  866. data/lib/studium.rb +5 -0
  867. data/studium.gemspec +80 -0
  868. data/test/testing_studium.rb +244 -0
  869. data/test/testing_studium_base_class.rb +17 -0
  870. data/test/testing_time_component.rb +29 -0
  871. metadata +1078 -0
@@ -0,0 +1,1135 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === Studium::Exams::ExamQuestion
6
+ #
7
+ # This class, created in December 2021 / January 2022, can handle exam
8
+ # questions and study-related questions.
9
+ #
10
+ # The user can pass a given topic to this class, as a String, such as
11
+ # "microbiology", and then this class will randomly select one of the
12
+ # existing entries fitting to that particular topic at hand, and then
13
+ # ask the question, before revealing the answer after a delay. The
14
+ # specified delay is usually fairly small, at about 3 seconds, but
15
+ # this can be set by the user to any different value.
16
+ #
17
+ # The delay, e. g. 3 seconds, is read in from a yaml file (if that
18
+ # file exists, otherwise we will use a default value). Alternatively
19
+ # the delay can be set from the commandline via, for instance:
20
+ #
21
+ # qa 'delay = 5'
22
+ #
23
+ # The topic given thus determines which exam question is to be handled.
24
+ #
25
+ # By default, if no argument is provided to this class, then a random
26
+ # topic (and thus a random question) will be picked, from all the
27
+ # available topics.
28
+ #
29
+ # Every time a question is asked, the "last asked question"
30
+ # information is stored into a file.
31
+ #
32
+ # The "exam pool" constitutes the available, unanswered exams.
33
+ #
34
+ # The method Studium.runmode? will tell us whether we are on
35
+ # the commandline or whether we are used on the www, such as
36
+ # from a .cgi script.
37
+ #
38
+ # The class can operate on one question at a time, or in batch
39
+ # mode, which will call "all questions". (By default, I usually
40
+ # prefer to just have one question asked).
41
+ #
42
+ # Usage examples in ruby code:
43
+ #
44
+ # x = Studium::Exams::ExamQuestion.new('- Wir können Melanome nach der "ABCDE" Regel beurteilen. Wofür stehen diese Abkürzungen? (1) A: Asymmetry (2) B: Border (3) C: Color (4) D: Diameter (5) E: Evolving')
45
+ # x = Studium::Exams::ExamQuestion.new('- Nenne die beiden wichtigsten Mechanismen zur Verhinderung der Selbstbefruchtung. A: (1) physische Trennung von männlichen und weiblichen Gametophyten (2) genetisch, über die Selbst-Inkompatibilität')
46
+ # x = Studium::Exams::ExamQuestion.new('- Nenne die Zucker des Calvin-Zyklus, beginnend von RUBISCO, im "Uhrzeigersinn"! A: (1) 3-Phosphoglycerat (2) 1,3-Bisphosphoglycerat (3) G3P (4) 5-G3P und Ribulose-1-5-Bisphosphat.')
47
+ # x = Studium::Exams::ExamQuestion.new('- abc? def? ya') { :do_not_run_yet }
48
+ #
49
+ # =========================================================================== #
50
+ # require 'studium/exams/exam_question/exam_question.rb'
51
+ # Studium::Exams::ExamQuestion.new(ARGV)
52
+ # y = Studium.ask_question('amg2') { :do_not_run_yet }
53
+ # =========================================================================== #
54
+ require 'studium/base/base.rb'
55
+
56
+ module Studium
57
+
58
+ module Exams
59
+
60
+ class ExamQuestion < ::Studium::Base # === Studium::Exams::ExamQuestion
61
+
62
+ require 'studium/constants/constants.rb'
63
+ require 'studium/exams/exam_question/answer.rb'
64
+ require 'studium/exams/exam_question/menu.rb'
65
+ require 'studium/exams/exam_question/misc.rb'
66
+ require 'studium/exams/exam_question/reset.rb'
67
+ require 'studium/statistics/report_how_many_exam_questions_were_answered.rb'
68
+
69
+ begin
70
+ require 'verbose_truth'
71
+ rescue LoadError; end
72
+
73
+ # ========================================================================= #
74
+ # === @rename_konsole_tab
75
+ # ========================================================================= #
76
+ @rename_konsole_tab = false
77
+
78
+ # ========================================================================= #
79
+ # === Studium::Exams::ExamQuestion.rename_konsole_tab?
80
+ # ========================================================================= #
81
+ def self.rename_konsole_tab?
82
+ @rename_konsole_tab
83
+ end
84
+
85
+ # ========================================================================= #
86
+ # === Studium::Exams::ExamQuestion.set_rename_konsole_tab
87
+ # ========================================================================= #
88
+ def self.set_rename_konsole_tab(i)
89
+ @rename_konsole_tab = i
90
+ end
91
+
92
+ # ========================================================================= #
93
+ # === initialize
94
+ #
95
+ # The very first argument given to this class is usually the topic
96
+ # that is sought, such as "bem1" or "amg1" or "plants", and so
97
+ # forth.
98
+ # ========================================================================= #
99
+ def initialize(
100
+ commandline_arguments = ARGV,
101
+ run_already = true,
102
+ &block
103
+ )
104
+ set_commandline_arguments(
105
+ commandline_arguments
106
+ )
107
+ reset
108
+ # ======================================================================= #
109
+ # === Handle blocks next
110
+ # ======================================================================= #
111
+ if block_given?
112
+ yielded = yield
113
+ case yielded # (case tag)
114
+ # ===================================================================== #
115
+ # === :disable_colours
116
+ # ===================================================================== #
117
+ when :disable_colours,
118
+ :no_colours
119
+ # =================================================================== #
120
+ # The user does not want to use colours in this case, so let's
121
+ # disable colours then.
122
+ # =================================================================== #
123
+ disable_colours
124
+ set_mode :www # ← Experimental as of 13.04.2019.
125
+ # ===================================================================== #
126
+ # === :then_determine_the_split_position_without_using_colours
127
+ # ===================================================================== #
128
+ when :then_determine_the_split_position_without_using_colours
129
+ @internal_hash[:do_determine_the_split_position] = true
130
+ disable_colours
131
+ # ===================================================================== #
132
+ # === :then_determine_the_split_position
133
+ # ===================================================================== #
134
+ when :then_determine_the_split_position
135
+ @internal_hash[:do_determine_the_split_position] = true
136
+ # ===================================================================== #
137
+ # === :then_determine_the_split_position_while_disabling_the_colours
138
+ # ===================================================================== #
139
+ when :then_determine_the_split_position_while_disabling_the_colours
140
+ @internal_hash[:do_determine_the_split_position] = true
141
+ disable_colours
142
+ set_mode :www # ← Experimental as of 13.04.2019.
143
+ # ===================================================================== #
144
+ # === :do_not_run_yet
145
+ # ===================================================================== #
146
+ when :do_not_run_yet
147
+ run_already = false
148
+ end
149
+ end
150
+ case run_already
151
+ # ======================================================================= #
152
+ # === :do_not_run
153
+ #
154
+ # Handle the situation when we do not want to run automatically.
155
+ #
156
+ # This is for arguments such as :dont_run_yet.
157
+ # ======================================================================= #
158
+ when :do_not_run,
159
+ :do_not,
160
+ :dont_run,
161
+ :dont_run_yet,
162
+ :do_not_run_yet
163
+ run_already = false
164
+ # ======================================================================= #
165
+ # === :commandline
166
+ # ======================================================================= #
167
+ when :commandline
168
+ run_already = false
169
+ set_commandline
170
+ end
171
+ run if run_already
172
+ end
173
+
174
+ # ========================================================================= #
175
+ # === show_help_usage (help tag)
176
+ #
177
+ # We show help usage of this class here via this method. It is typically
178
+ # used from the commandline.
179
+ #
180
+ # To show this help message, use this:
181
+ #
182
+ # qa --help
183
+ #
184
+ # ========================================================================= #
185
+ def show_help_usage(
186
+ then_exit = false
187
+ )
188
+ case then_exit
189
+ # ======================================================================= #
190
+ # === :do_exit
191
+ # ======================================================================= #
192
+ when :do_exit,
193
+ :exit
194
+ then_exit = true
195
+ end
196
+ opnn; e "Currently the following extra commands can be issued:#{N}#{N}"
197
+ lpad = ' ' * 4
198
+ e "#{lpad}--set_default_topic= #{yellow(' Set a default topic.')}"
199
+ e lpad+'TOPICS '+
200
+ yellow(' List all available topics.')
201
+ e lpad+'TOTAL '+
202
+ yellow(" Show how many questions are known in total.")
203
+ e lpad+'FINISHED '+
204
+ yellow(' Show which topics are '\
205
+ 'completely finished (100% answered).')
206
+ e lpad+'EDIT '+
207
+ yellow(' To edit the exam questions '\
208
+ 'file, via vim.')
209
+ e lpad+'LAST_TOPIC '+
210
+ yellow(' Show the last topic used.')
211
+ e lpad+'BLOCK '+
212
+ yellow(' List all questions that '\
213
+ 'were already answered for a given section.')
214
+ e lpad+'OPEN '+
215
+ yellow(' Open this file here in an editor.')
216
+ e lpad+'--download-exam-topics '+
217
+ yellow(' Download the exam topics.')
218
+ e lpad+'--all-questions '+
219
+ yellow(' Ask all questions, including those marked '\
220
+ 'with a trailing "[]".')
221
+ e lpad+'delay? '+
222
+ yellow(' show the default delay.')
223
+ e lpad+"'delay = 5' "+
224
+ yellow(' to set a new delay to 5 seconds.')
225
+ e lpad+"'set-delay = 5' "+
226
+ yellow(' to set a new delay '\
227
+ 'to 5 seconds. (as ^^^ above)')
228
+ if is_on_roebe? # Show more options only on my system.
229
+ e lpad+'rename_tab? '+
230
+ yellow(' whether to rename the KDE konsole tab or not.')
231
+ e lpad+'rename_tab: true'+
232
+ yellow(' enable renaming of the KDE konsole tab.')
233
+ e lpad+'rename_tab: false'+
234
+ yellow(' disable rename of the KDE konsole tab.')
235
+ end
236
+ e
237
+ exit if then_exit
238
+ end
239
+
240
+ # ========================================================================= #
241
+ # === report_the_delay
242
+ # ========================================================================= #
243
+ def report_the_delay
244
+ e "#{rev}The delay is set to: #{sfancy(delay?.to_s)}"
245
+ end
246
+
247
+ # ========================================================================= #
248
+ # === delay?
249
+ # ========================================================================= #
250
+ def delay?
251
+ @internal_hash[:delay]
252
+ end; alias delay delay? # === delay
253
+
254
+ # ========================================================================= #
255
+ # === set_delay
256
+ #
257
+ # Set the default delay value via this method.
258
+ # ========================================================================= #
259
+ def set_delay(
260
+ i = :load_from_file
261
+ )
262
+ case i
263
+ # ======================================================================= #
264
+ # === :default
265
+ # ======================================================================= #
266
+ when :default,
267
+ :load_from_file,
268
+ nil
269
+ # ===================================================================== #
270
+ # === :delay
271
+ # ===================================================================== #
272
+ if File.exist? FILE_DELAY
273
+ i = YAML.load_file(FILE_DELAY)
274
+ i = i['delay'] if i.respond_to?('delay')
275
+ else
276
+ # =================================================================== #
277
+ # This is the default if the file can not be found/read. It
278
+ # can be found in the file studium/constants/delay.rb.
279
+ # =================================================================== #
280
+ i = DEFAULT_DELAY
281
+ end
282
+ end
283
+ if i.is_a? Hash
284
+ i = i['delay']
285
+ end
286
+ @internal_hash[:delay] = i.to_f
287
+ end; alias determine_the_default_delay set_delay # === determine_the_default_delay
288
+ alias delay= set_delay # === delay=
289
+
290
+ # ========================================================================= #
291
+ # === set_and_store_delay
292
+ #
293
+ # Combine two methods in one here.
294
+ # ========================================================================= #
295
+ def set_and_store_delay(i)
296
+ set_delay(i)
297
+ store_delay(i)
298
+ end
299
+
300
+ # ========================================================================= #
301
+ # === read_delay_from_file (load delay)
302
+ #
303
+ # Use this method here, read_delay_from_file(), to read in the
304
+ # default delay from a stored file.
305
+ # ========================================================================= #
306
+ def read_delay_from_file
307
+ if File.exist? DELAY_CONSTANT_STORED_HERE
308
+ _ = YAML.load_file(DELAY_CONSTANT_STORED_HERE)
309
+ result = _['delay']
310
+ else # Else the file does not exist, so we use the default delay.
311
+ result = DEFAULT_DELAY
312
+ end
313
+ return result
314
+ end
315
+
316
+ # ========================================================================= #
317
+ # === topic?
318
+ # ========================================================================= #
319
+ def topic?
320
+ @internal_hash[:topic]
321
+ end; alias exam_topic? topic? # === exam_topic?
322
+ alias exam_title? topic? # === exam_title?
323
+ alias which_topic? topic? # === which_topic?
324
+ alias topic topic? # === topic
325
+ alias title topic? # === title
326
+ alias title? topic? # === title?
327
+ alias category? topic? # === category?
328
+
329
+ # ========================================================================= #
330
+ # === dataset?
331
+ # ========================================================================= #
332
+ def dataset?
333
+ @internal_hash[:dataset_from_the_file]
334
+ end
335
+
336
+ # ========================================================================= #
337
+ # === set_dataset
338
+ # ========================================================================= #
339
+ def set_dataset(i)
340
+ @internal_hash[:dataset_from_the_file] = i
341
+ end
342
+
343
+ # ========================================================================= #
344
+ # === sanitize_the_obtained_dataset (sanitized tag)
345
+ #
346
+ # This method exists primarily to remove all trailing "\n", and then
347
+ # remove all [] entries, as well as show how many exam questions are
348
+ # in that given file.
349
+ # ========================================================================= #
350
+ def sanitize_the_obtained_dataset
351
+ dataset = dataset?.map {|entry| entry.strip }
352
+ set_dataset(dataset)
353
+ # ======================================================================= #
354
+ # === :n_exam_questions_in_total
355
+ # ======================================================================= #
356
+ @internal_hash[:n_exam_questions_in_total] = dataset.size
357
+ _ = dataset.reject {|line|
358
+ line.end_with? '[]'
359
+ }
360
+ set_exam_pool(_) if _ # Keep track of the unanswered exam questions here.
361
+ # ======================================================================= #
362
+ # === :n_exam_questions_unanswered
363
+ # ======================================================================= #
364
+ @internal_hash[:n_exam_questions_unanswered] = _.size
365
+ # ======================================================================= #
366
+ # === :n_exam_questions_answered
367
+ # ======================================================================= #
368
+ @internal_hash[:n_exam_questions_answered] = (
369
+ @internal_hash[:n_exam_questions_in_total] - _.size
370
+ )
371
+ end
372
+
373
+ # ========================================================================= #
374
+ # === set_exam_question
375
+ # ========================================================================= #
376
+ def set_exam_question(i)
377
+ i = i.dup if i.frozen?
378
+ i.strip! # Get rid of trailing newlines.
379
+ i[0, 2] = '' if i.start_with?('- ') # Chop off leading '-' components.
380
+ i[-2, 2] = '' if i.end_with?(' A')
381
+ i[-2, 2] = '' if i.end_with?('?A')
382
+ i[-3, 3] = '' if i.end_with?(' A?')
383
+ i[-2, 2] = '' if i.end_with?('! ?') # Preserve the ! here.
384
+ # ======================================================================= #
385
+ # i[-2,2] = '' if i.end_with? 'A?'
386
+ # ^^^ The above check is not good because the question may end like:
387
+ # "T-DNA?". Perhaps we have to think of another way.
388
+ # ======================================================================= #
389
+ if i.end_with? '. ?' # This can not be correct - it must be a typo.
390
+ i[-2, 2] = '' # Thus get rid of the last two entries.
391
+ end
392
+ if i.end_with? '.?','!?' # These two values can not be correct - it must thus be a typo.
393
+ i.chop! # Thus get rid of the last two entries.
394
+ end
395
+ i.strip! # ← Always chop off trailing newlines, just in case.
396
+ # ======================================================================= #
397
+ # A question typically will have a trailing '?', thus we ensure this
398
+ # by actually appending a question mark '?' - unless the string
399
+ # already ends with '?', '.' or a '!'.
400
+ # ======================================================================= #
401
+ unless i.rstrip.end_with?('?','.','!')
402
+ i << '?' # Ensure a trailing '?' here.
403
+ end
404
+ # ======================================================================= #
405
+ # Next we will determine how many characters are in the given line.
406
+ # We need to exclude ANSII escape sequences, though, as they
407
+ # will not be shown on the commandline - they will be interpreted
408
+ # differently, such as displaying a red underline colour for the
409
+ # given text.
410
+ # ======================================================================= #
411
+ trimmed_sequence = remove_escape_sequences(
412
+ remove_tags_from_this_input(i)
413
+ )
414
+ n_characters_to_consider_in_the_line = trimmed_sequence.size
415
+ if n_characters_to_consider_in_the_line > @internal_hash[:word_wrap_at]
416
+ i = word_wrap(i, @internal_hash[:word_wrap_at])
417
+ end
418
+ # ======================================================================= #
419
+ # Next, consider colourizing all questions that have at the least 2
420
+ # '"' characters. These will be colourized if a certain constant is
421
+ # set to true.
422
+ # ======================================================================= #
423
+ if EMPHASIZE_WORDS_IN_QUOTES_IN_A_GIVEN_QUESTION
424
+ if use_colours? and commandline? and (i.count('"') > 1)
425
+ use_this_regex = /"(.+?\s*.*?)"/ # See: https://rubular.com/r/6WK5NjMJld
426
+ # =================================================================== #
427
+ # Next make use of the default colour to use.
428
+ # =================================================================== #
429
+ use_this_colour = ::Colours.send(colour_for_questions?) { :omit_end }
430
+ i.gsub!(use_this_regex,
431
+ '"'+forestgreen('\1'.delete(N))+ # forestgreen is the hardcoded colour to be used for now.
432
+ use_this_colour+'"'
433
+ )
434
+ end
435
+ end
436
+ @internal_hash[:exam_question] = i
437
+ end; alias set_question set_exam_question # === set_question
438
+
439
+ # ========================================================================= #
440
+ # === show_filesize_of_all_exams
441
+ #
442
+ # To call this method, do:
443
+ #
444
+ # qa --filesize?
445
+ #
446
+ # ========================================================================= #
447
+ def show_filesize_of_all_exams
448
+ this_exam_topic = directory_of_the_exam_topics?
449
+ all_filesizes = Dir["#{this_exam_topic}*"].map {|entry|
450
+ File.size?(entry)
451
+ }
452
+ sum = all_filesizes.sum
453
+ sum_in_kb = sum / 1000.0
454
+ sum_in_mb = sum_in_kb / 1000.0
455
+ e "#{rev}The total file size of all exams in "\
456
+ "#{sdir(this_exam_topic)} is:"
457
+ e
458
+ e ' '+simp(sum.to_s)+
459
+ ' Bytes ('+
460
+ sfancy(sum_in_mb.round(2).to_s)+' MB)'
461
+ e
462
+ end
463
+
464
+ # ========================================================================= #
465
+ # === set_exam_file
466
+ #
467
+ # The file location will be something like:
468
+ #
469
+ # /Programs/Ruby/2.3.1/lib/ruby/site_ruby/2.3.0/studium/exam_topics/physiologie
470
+ #
471
+ # ========================================================================= #
472
+ def set_exam_file(i)
473
+ @internal_hash[:exam_file] = i
474
+ end; alias set_file set_exam_file # === set_file
475
+
476
+ # ========================================================================= #
477
+ # === default_delay?
478
+ # ========================================================================= #
479
+ def default_delay?
480
+ DEFAULT_DELAY
481
+ end
482
+
483
+ # ========================================================================= #
484
+ # === colourize_https_substring
485
+ #
486
+ # Input that passes into the following method, can look like this:
487
+ #
488
+ # 'Das "CDT-Toxin". => https://www.ncbi.nlm.nih.gov/pubmed/24253566'
489
+ #
490
+ # ========================================================================= #
491
+ def colourize_https_substring(i)
492
+ if i.include? 'https://'
493
+ use_this_regex = /(https:\/\/.+)/ # See: https://rubular.com/r/4quDI8hKxS
494
+ i =~ use_this_regex
495
+ i.gsub!(use_this_regex, slateblue('\1')) if $1
496
+ end
497
+ return i
498
+ end
499
+
500
+ # ========================================================================= #
501
+ # === assign_url_or_colourize_https_substring
502
+ # ========================================================================= #
503
+ def assign_url_or_colourize_https_substring(i)
504
+ if i.include?(' URL:')
505
+ assign_url(i)
506
+ elsif i.include?(' https://')
507
+ colourize_https_substring(i)
508
+ end
509
+ end
510
+
511
+ # ========================================================================= #
512
+ # === show_line
513
+ # ========================================================================= #
514
+ def show_line
515
+ e exam_question_line?
516
+ end
517
+
518
+ # ========================================================================= #
519
+ # === exam_question?
520
+ # ========================================================================= #
521
+ def exam_question?
522
+ @internal_hash[:exam_question]
523
+ end; alias question? exam_question? # === question?
524
+ alias question exam_question? # === question
525
+ alias first exam_question? # === first
526
+
527
+ # ========================================================================= #
528
+ # === sleep_default_delay
529
+ #
530
+ # This method can be used to sleep for the specified duration.
531
+ #
532
+ # Since as of April 2012 the method will also handle SIGINT-events
533
+ # gracefully.
534
+ # ========================================================================= #
535
+ def sleep_default_delay(
536
+ i = delay?
537
+ )
538
+ begin
539
+ sleep(i)
540
+ rescue Interrupt # We are silent here.
541
+ exit_program
542
+ end
543
+ end; alias default_sleep sleep_default_delay # === default_sleep
544
+ alias do_sleep sleep_default_delay # === do_sleep
545
+ alias start_default_sleep sleep_default_delay # === start_default_sleep
546
+
547
+ # ========================================================================= #
548
+ # === report_how_many_topics_are_available
549
+ # ========================================================================= #
550
+ def report_how_many_topics_are_available
551
+ opnn; e 'There are exactly '+
552
+ simp(Studium.available_topics?.size.to_s)+
553
+ ' topics available.'
554
+ end
555
+
556
+ # ========================================================================= #
557
+ # === try_to_load_custom_colours
558
+ #
559
+ # This method can be used to designate specific colours for use by
560
+ # this class.
561
+ # ========================================================================= #
562
+ def try_to_load_custom_colours
563
+ _ = "#{::Studium.project_yaml_directory?}colours/custom_colours.yml"
564
+ if File.exist? _
565
+ dataset = YAML.load_file(_)
566
+ set_colour_for_questions(
567
+ dataset['colour_for_questions']
568
+ )
569
+ set_colour_for_answers(
570
+ dataset['colour_for_answers']
571
+ )
572
+ else
573
+ if is_on_roebe?
574
+ e 'No file could be found at '+sfile(_)+'.'
575
+ end
576
+ end
577
+ end
578
+
579
+ # ========================================================================= #
580
+ # === default_colour?
581
+ # ========================================================================= #
582
+ def default_colour?
583
+ USE_THESE_COLOURS[:default_colour]
584
+ end
585
+
586
+ # ========================================================================= #
587
+ # === internal_hash?
588
+ # ========================================================================= #
589
+ def internal_hash?
590
+ @internal_hash
591
+ end
592
+
593
+ # ========================================================================= #
594
+ # === report_the_default_topic_in_use
595
+ #
596
+ # This method will report the default topic in use. We must also check
597
+ # whether the file in questions exists, before proceeding.
598
+ #
599
+ # To invoke this, do:
600
+ #
601
+ # qa --default-topic?
602
+ #
603
+ # ========================================================================= #
604
+ def report_the_default_topic_in_use(
605
+ this_file = "#{log_dir?}use_this_exam_topic.yml"
606
+ )
607
+ if File.exist? this_file
608
+ topic = File.read(this_file).chomp
609
+ e "The default topic in use is: #{simp(topic)}"
610
+ else
611
+ e "#{rev}No file exists at `#{sfile(this_file)}`. This "\
612
+ "means that no"
613
+ e 'default topic has been set.'
614
+ e
615
+ e 'If you wish to designate a default topic, use this invocation:'
616
+ e
617
+ e steelblue(' qa --set_default_topic=amg')
618
+ e steelblue(' qa --set_default_topic=phys')
619
+ e
620
+ end
621
+ end
622
+
623
+ # ========================================================================= #
624
+ # === exam_answer?
625
+ # ========================================================================= #
626
+ def exam_answer?
627
+ @internal_hash[:exam_answer]
628
+ end; alias answer? exam_answer? # === answer?
629
+ alias answer exam_answer? # === answer
630
+ alias last exam_answer? # === last
631
+
632
+ # ========================================================================= #
633
+ # === set_exam_answer
634
+ #
635
+ # This method can be used to keep track of the current exam-answer - that
636
+ # is the answer that fits to the exam-question at hand. Before it is
637
+ # set, though, this method will do various sanitizing actions, to make
638
+ # sure the answer is sufficiently "improved", before it is displayed
639
+ # to the user (or whoever invoked this class).
640
+ #
641
+ # Perhaps this should be factored out into a separate method, but for
642
+ # now it will remain as it is.
643
+ #
644
+ # Note that every question must have an associated answer. This is
645
+ # the very basic assumption for the "studium" gem every question
646
+ # must adhere to.
647
+ # ========================================================================= #
648
+ def set_exam_answer(
649
+ i
650
+ )
651
+ # ======================================================================= #
652
+ # === Handle Array as input
653
+ #
654
+ # This can happen due to assign_url() returning an Array.
655
+ # ======================================================================= #
656
+ i = i.first if i.is_a? Array
657
+ i = i.dup if i.frozen? # Work on non-frozen Strings past this point here.
658
+ i.strip! # This also implies .chomp.
659
+ i[-3, 3] = '' if i.end_with?(' []') # Get rid of trailing [], just in case.
660
+ # ======================================================================= #
661
+ # === Get rid of ' A:' if they are in that string.
662
+ #
663
+ # At this point, we do no longer want to have 'A:' in our answer-string,
664
+ # so we get rid of it.
665
+ #
666
+ # The old code up until 2022 was:
667
+ #
668
+ # if i.include? ' A:'
669
+ # i.sub!(/ A:/,'') unless i.include? ') A:' # The unless check exists to avoid rare cases..
670
+ #
671
+ # ======================================================================= #
672
+ i[0, 3] = '' if i.start_with?('A: ') # Three characters are in the argument.
673
+ i[0, 2] = '' if i.start_with?('- ')
674
+ i[0, 2] = '' if i.start_with?(': ','? ','?:')
675
+ i.sub!(/^\?/,'') if i.start_with? '?' # Only chop it away at the beginning.
676
+ if i.include? '(a)' # Also assume (b) (c) etc..
677
+ i.gsub!(/\(a\)/, N+' (a)')
678
+ i.gsub!(/\(b\)/, N+' (b)') if i.include? '(b)'
679
+ i.gsub!(/\(c\)/, N+' (c)') if i.include? '(c)'
680
+ i.gsub!(/\(d\)/, N+' (d)') if i.include? '(d)'
681
+ i.gsub!(/\(e\)/, N+' (e)') if i.include? '(e)'
682
+ i.gsub!(/\(f\)/, N+' (f)') if i.include? '(f)'
683
+ end
684
+ # ======================================================================= #
685
+ # Assume () modifications. But this conflicts with entries that have
686
+ # a pure () as part of their answer, which may happen on computer
687
+ # related questions such as foobar(). Hence, since as of December 2014,
688
+ # I have disabled the following line.
689
+ # ======================================================================= #
690
+ # i.gsub!(/\(\)/, N+'- ') if i.include? '()'
691
+ # ======================================================================= #
692
+ if debug?
693
+ e "We will now set the answer to: #{sfancy(i)}" if commandline?
694
+ end
695
+ # ======================================================================= #
696
+ # === Replace <br> tags, should they be part of the answer
697
+ # ======================================================================= #
698
+ i.gsub!(/<br>/, N) if i.include? '<br>'
699
+ # ======================================================================= #
700
+ # === Colourize words in quotes
701
+ #
702
+ # Next, consider colourizing all answers that have at the least 2
703
+ # '"' characters. These will be colourized.
704
+ # ======================================================================= #
705
+ if EMPHASIZE_WORDS_IN_QUOTES_IN_A_GIVEN_ANSWER
706
+ if use_colours? and commandline? and (i.count('"') > 1)
707
+ use_this_regex = /"(.+?\s*.*?)"/ # See: http://rubular.com/r/6WK5NjMJld
708
+ use_this_colour = ::Colours.send(colour_for_answers?) { :omit_end }
709
+ i.gsub!(
710
+ use_this_regex,
711
+ '"'+steelblue('\1'.delete(N))+
712
+ use_this_colour+'"'
713
+ )
714
+ end
715
+ end
716
+ @internal_hash[:exam_answer] = i
717
+ end; alias set_answer set_exam_answer # === set_answer
718
+
719
+ # ========================================================================= #
720
+ # === may_we_show_the_topic?
721
+ # ========================================================================= #
722
+ def may_we_show_the_topic?
723
+ @internal_hash[:may_we_show_the_topic]
724
+ end; alias may_we_show_the_topic may_we_show_the_topic? # === may_we_show_the_topic
725
+
726
+ # ========================================================================= #
727
+ # === set_may_we_show_the_topic
728
+ # ========================================================================= #
729
+ def set_may_we_show_the_topic(i = MAY_WE_SHOW_THE_TOPIC)
730
+ @internal_hash[:may_we_show_the_topic] = i
731
+ end; alias may_we_show_the_topic= set_may_we_show_the_topic # === may_we_show_the_topic=
732
+ alias set_show_topic set_may_we_show_the_topic # === set_show_topic
733
+
734
+ # ========================================================================= #
735
+ # === set_colour_for_questions
736
+ # ========================================================================= #
737
+ def set_colour_for_questions(i)
738
+ @internal_hash[:colour_for_questions] = i.to_sym
739
+ end
740
+
741
+ # ========================================================================= #
742
+ # === set_colour_for_answers
743
+ # ========================================================================= #
744
+ def set_colour_for_answers(i)
745
+ @internal_hash[:colour_for_answers] = i.to_sym
746
+ end
747
+
748
+ # ========================================================================= #
749
+ # === set_custom_colours
750
+ #
751
+ # This setter is, since as of January 2022, just calling two methods now.
752
+ # This was simpler to maintain than using another ad-hoc Hash.
753
+ #
754
+ # Valid keys for the colours should be, for instance, "colour_for_questions"
755
+ # or "colour_for_answers".
756
+ # ========================================================================= #
757
+ def set_custom_colours(i)
758
+ if i.is_a?(String) and i.include?('|')
759
+ # ===================================================================== #
760
+ # Allow custom input, as String, so users can override this.
761
+ # ===================================================================== #
762
+ splitted = i.split('|')
763
+ set_colour_for_questions(splitted.first)
764
+ set_colour_for_answers(splitted.last)
765
+ end
766
+ end
767
+
768
+ # ========================================================================= #
769
+ # === pick_a_random_line_from_the_obtained_dataset
770
+ # ========================================================================= #
771
+ def pick_a_random_line_from_the_obtained_dataset
772
+ _ = dataset?.reject {|line| line.end_with?(' []') } # Reject already solved exam questions.
773
+ use_this_sample = _.sample
774
+ set_exam_question_line(use_this_sample)
775
+ try_to_save_the_line(use_this_sample)
776
+ end
777
+
778
+ # ========================================================================= #
779
+ # === set_split_position
780
+ # ========================================================================= #
781
+ def set_split_position(i = nil)
782
+ @internal_hash[:split_position] = i
783
+ end; alias set_index_position set_split_position # === set_index_position
784
+
785
+ # ========================================================================= #
786
+ # === split_position?
787
+ # ========================================================================= #
788
+ def split_position?
789
+ @internal_hash[:split_position]
790
+ end
791
+
792
+ # ========================================================================= #
793
+ # === consider_warning_the_user_if_there_are_too_many_exams_registered
794
+ #
795
+ # The threshold value of n exam questions at maximum is at 1000
796
+ # usually.
797
+ # ========================================================================= #
798
+ def consider_warning_the_user_if_there_are_too_many_exams_registered(
799
+ threshold_value = THRESHOLD_VALUE_N_EXAMS_AT_MAXIMUM
800
+ )
801
+ if WARN_THE_USER_IF_THERE_ARE_TOO_MANY_QUESTIONS_REGISTERED_IN_AN_EXAM_TOPIC and
802
+ # ===================================================================== #
803
+ # Check if we have more questions than we are allowed to have.
804
+ # ===================================================================== #
805
+ (n_exam_questions? > threshold_value)
806
+ e
807
+ opnn; e swarn('Do note that there are too many exam questions '\
808
+ 'registered in the file:')
809
+ e
810
+ e " #{sfile(which_file?)}"
811
+ e
812
+ end
813
+ end
814
+
815
+ # ========================================================================= #
816
+ # === menu_on_the_commandline_as_a_string
817
+ # ========================================================================= #
818
+ def menu_on_the_commandline_as_a_string(
819
+ i = commandline_as_string
820
+ )
821
+ case i
822
+ # ======================================================================= #
823
+ # === qa --open
824
+ #
825
+ # This entry point can be used to open an exam topic file via the
826
+ # editor.
827
+ #
828
+ # A commandline example follows:
829
+ #
830
+ # qa ab2 open
831
+ #
832
+ # ======================================================================= #
833
+ when /open (.+)/,
834
+ /(.+) open/
835
+ topic = $1.to_s.dup # Example: qa --open amg
836
+ topic = find_corresponding_exam_topic(topic)
837
+ topic = ::Studium.directory_to_my_exam_topics+File.basename(topic)
838
+ open_this_file_in_editor(topic)
839
+ exit
840
+ # ======================================================================= #
841
+ # === qa "delay = 3.0"
842
+ #
843
+ # Invoke this like so:
844
+ #
845
+ # qa delay = 3.0
846
+ #
847
+ # ======================================================================= #
848
+ when /^DELAY =? ?(\d{0,1}.\d{1})/i,
849
+ /^DEL =? ?(\d{0,1}.\d{1})/i,
850
+ /^set_delay =? ?(\d{0,1}.\d{1})/i,
851
+ /^set_delay :? ?(\d{0,1}.\d{1})/i,
852
+ /^set_delay ?(\d{0,1}.\d{1})/i # === qa set_delay 3.1
853
+ _ = $1.to_s.dup
854
+ set_and_store_delay(_)
855
+ end
856
+ end
857
+
858
+ # ========================================================================= #
859
+ # === return_the_full_expanded_exam_title
860
+ # ========================================================================= #
861
+ def return_the_full_expanded_exam_title(exam_title = exam_title?)
862
+ return Studium.find_corresponding_exam_title(exam_title)
863
+ end
864
+
865
+ # ========================================================================= #
866
+ # === colour_for_answers?
867
+ # ========================================================================= #
868
+ def colour_for_answers?
869
+ @internal_hash[:colour_for_answers]
870
+ end
871
+
872
+ # ========================================================================= #
873
+ # === colour_for_questions?
874
+ # ========================================================================= #
875
+ def colour_for_questions?
876
+ @internal_hash[:colour_for_questions]
877
+ end
878
+
879
+ # ========================================================================= #
880
+ # === n_questions_already_answered?
881
+ # ========================================================================= #
882
+ def n_questions_already_answered?
883
+ @internal_hash[:n_exam_questions_answered]
884
+ end
885
+
886
+ # ========================================================================= #
887
+ # === report_whether_we_will_show_the_topic
888
+ # ========================================================================= #
889
+ def report_whether_we_will_show_the_topic
890
+ opnn; e 'Will we show the topic of the exams when '\
891
+ 'asking a question: '+
892
+ simp(VerboseTruth[may_we_show_the_topic?])
893
+ end
894
+
895
+ # ========================================================================= #
896
+ # === exam_question_line?
897
+ # ========================================================================= #
898
+ def exam_question_line?
899
+ @internal_hash[:exam_question_line]
900
+ end; alias line? exam_question_line? # === line?
901
+ alias line exam_question_line? # === line
902
+ alias full_question_line? exam_question_line? # === full_question_line?
903
+
904
+ # ========================================================================= #
905
+ # === set_default_topic_for_the_gui
906
+ # ========================================================================= #
907
+ def set_default_topic_for_the_gui(
908
+ what,
909
+ into = "#{log_dir?}use_this_exam_topic.yml"
910
+ )
911
+ opnn; e "Now setting the default topic to `#{simp(what)}`."
912
+ write_what_into(what, into)
913
+ end
914
+
915
+ # ========================================================================= #
916
+ # === tell_whether_we_will_rename_the_kde_konsole_tab
917
+ # ========================================================================= #
918
+ def tell_whether_we_will_rename_the_kde_konsole_tab
919
+ e 'Will we rename the KDE konsole tab? '+
920
+ simp(
921
+ VerboseTruth[load_file_rename_konsole_tab.to_s]
922
+ )
923
+ end
924
+
925
+ # ========================================================================= #
926
+ # === line_contains_italic_token?
927
+ # ========================================================================= #
928
+ def line_contains_italic_token?(i = line?)
929
+ (i.include?('<it>') and i.include?('</it>')) or
930
+ (i.include?('<i>') and i.include?('</i>'))
931
+ end
932
+
933
+ # ========================================================================= #
934
+ # === line_contains_underline_token?
935
+ # ========================================================================= #
936
+ def line_contains_underline_token?(i = line?)
937
+ (i.include?('<ud>') and i.include?('</ud>')) or
938
+ (i.include?('<u>') and i.include?('</u>'))
939
+ end
940
+
941
+ # ========================================================================= #
942
+ # === line_contains_bold_token?
943
+ # ========================================================================= #
944
+ def line_contains_bold_token?(i = line?)
945
+ (i.include?('<b>') and i.include?('</b>'))
946
+ end
947
+
948
+ # ========================================================================= #
949
+ # === invoke_all_the_necessary_steps_before_the_question_is_asked
950
+ # ========================================================================= #
951
+ def invoke_all_the_necessary_steps_before_the_question_is_asked
952
+ determine_the_topic
953
+ try_to_read_in_the_dataset_from_the_corresponding_exam_file
954
+ sanitize_the_obtained_dataset
955
+ pick_a_random_line_from_the_obtained_dataset
956
+ parse_the_random_line_from_the_obtained_dataset
957
+ end; alias initial_steps invoke_all_the_necessary_steps_before_the_question_is_asked # === initial_steps
958
+ alias initialize_the_dataset invoke_all_the_necessary_steps_before_the_question_is_asked # === initialize_the_dataset
959
+
960
+ # ========================================================================= #
961
+ # === set_exam_question_line_and_then_parse_that_line
962
+ # ========================================================================= #
963
+ def set_exam_question_line_and_then_parse_that_line(i)
964
+ set_exam_question_line(i)
965
+ parse_that_line
966
+ end
967
+
968
+ # ========================================================================= #
969
+ # === n_questions_available?
970
+ #
971
+ # Return how many questions are available in the given dataset at hand.
972
+ # ========================================================================= #
973
+ def n_questions_available?
974
+ @internal_hash[:n_exam_questions_in_total]
975
+ end; alias n_exam_questions? n_questions_available? # === n_exam_questions?
976
+ alias n_questions? n_questions_available? # === n_questions?
977
+
978
+ # ========================================================================= #
979
+ # === run (run tag)
980
+ # ========================================================================= #
981
+ def run
982
+ menu_on_the_commandline_as_a_string
983
+ menu
984
+ invoke_all_the_necessary_steps_before_the_question_is_asked
985
+ ask_the_question_then_sleep_then_reveal_the_answer_to_that_question
986
+ # ======================================================================= #
987
+ # After the answer has been shown, it is time to display some statistics.
988
+ # ======================================================================= #
989
+ show_statistics
990
+ do_log_related_and_backup_related_actions
991
+ # ======================================================================= #
992
+ # Register the last file that was modified.
993
+ # ======================================================================= #
994
+ register_last_modified_file
995
+ end
996
+
997
+ # ========================================================================= #
998
+ # === Studium::Exams::ExamQuestion[]
999
+ # ========================================================================= #
1000
+ def self.[](i = '')
1001
+ new(i)
1002
+ end
1003
+
1004
+ end
1005
+
1006
+ # =========================================================================== #
1007
+ # === Studium::Exams.question_answer
1008
+ # =========================================================================== #
1009
+ def self.question_answer(
1010
+ topic = 'random_topic',
1011
+ run_already = true,
1012
+ &block
1013
+ )
1014
+ Studium::Exams::ExamQuestion.new(topic, run_already, &block)
1015
+ end
1016
+
1017
+ # =========================================================================== #
1018
+ # === Studium::Exams[]
1019
+ #
1020
+ # This will simply use AskQuestion as defined above.
1021
+ #
1022
+ # Usage examples, including aliases:
1023
+ #
1024
+ # amg = Studium::Exams['amg']
1025
+ # qa = Exams.question_answer('yo', :dont_run_yet)
1026
+ #
1027
+ # =========================================================================== #
1028
+ def self.[](i, run_already = true)
1029
+ Studium::Exams::ExamQuestion.new(i, run_already)
1030
+ end; self.instance_eval { alias ask_question [] } # === ::Studium::Exams.ask_question
1031
+
1032
+ end
1033
+
1034
+ # =========================================================================== #
1035
+ # === Studium.ask_question
1036
+ #
1037
+ # This provides an easier API to ask a question.
1038
+ #
1039
+ # Usage example:
1040
+ #
1041
+ # x = Studium.ask_question 'amg'
1042
+ # y = Studium.ask_question('amg2') { :do_not_run_yet }
1043
+ #
1044
+ # =========================================================================== #
1045
+ def self.ask_question(
1046
+ i = ARGV,
1047
+ run_already = true,
1048
+ &block
1049
+ )
1050
+ Studium::Exams::ExamQuestion.new(i, run_already, &block)
1051
+ end; self.instance_eval { alias question_answer ask_question } # === Studium.question_answer
1052
+ self.instance_eval { alias new_exam ask_question } # === Studium.new_exam
1053
+ self.instance_eval { alias ask_question ask_question } # === Studium.ask_question
1054
+ self.instance_eval { alias ask_exam_question ask_question } # === Studium.ask_exam_question
1055
+
1056
+ # =========================================================================== #
1057
+ # === Studium.random_question
1058
+ #
1059
+ # This method will ask a random exam question.
1060
+ # =========================================================================== #
1061
+ def self.random_question
1062
+ ask_question(:random)
1063
+ end
1064
+
1065
+ # =========================================================================== #
1066
+ # === Studium.delay_for_exam_questions?
1067
+ # =========================================================================== #
1068
+ def self.delay_for_exam_questions?
1069
+ ::Studium::DEFAULT_DELAY
1070
+ end
1071
+
1072
+ # =========================================================================== #
1073
+ # === Studium.random_exam_topic?
1074
+ #
1075
+ # This method will return a random exam topic when it is called.
1076
+ #
1077
+ # Usage examples:
1078
+ #
1079
+ # Studium.random_exam_topic? # => "epigenetik"
1080
+ # Studium.random_exam_topic? # => "abfall_als_ressource"
1081
+ # Studium.random_exam_topic? # => "embryologie_und_entwicklung"
1082
+ #
1083
+ # =========================================================================== #
1084
+ def self.random_exam_topic?
1085
+ ::Studium::Exams.all_topics_as_short_name.sort.sample
1086
+ end
1087
+
1088
+ # =========================================================================== #
1089
+ # === Studium.return_question_answer_as_array
1090
+ #
1091
+ # This method will return the question-answer combination, as an Array.
1092
+ #
1093
+ # It will not make use of any colours; the reason for this is because
1094
+ # when this method was added as of the 13.04.2019, it was to be used
1095
+ # primarily on the www.
1096
+ #
1097
+ # If the input is a String and contains '- ' then we assume that we do
1098
+ # NOT want to find a specific topic. Instead we will use the given
1099
+ # input as exam-question + exam-answer as such.
1100
+ #
1101
+ # Invocation examples:
1102
+ #
1103
+ # x = Studium.return_question_answer_as_array('amg1')
1104
+ # x = Studium.return_question_answer_as_array('biotech1')
1105
+ # x = Studium.return_question_answer_as_array(:biotech2)
1106
+ # x = Studium.return_question_answer_as_array('- In Ruby: <one>Bundler</one> likes ... ? Gemfile.lock.')
1107
+ #
1108
+ # =========================================================================== #
1109
+ def self.return_question_answer_as_array(
1110
+ topic = 'random_topic',
1111
+ &block
1112
+ )
1113
+ _ = ::Studium::Exams::ExamQuestion.new(topic, :do_not_run_yet, &block)
1114
+ if topic.is_a?(String) and topic.include?('-')
1115
+ _.set_exam_question_line_and_then_parse_that_line(topic)
1116
+ else
1117
+ _.invoke_all_the_necessary_steps_before_the_question_is_asked
1118
+ end
1119
+ _.disable_colours
1120
+ # ========================================================================= #
1121
+ # We will return the proper Array next:
1122
+ # ========================================================================= #
1123
+ [
1124
+ _.question?,
1125
+ _.answer?.delete("\n").squeeze(' ')
1126
+ ]
1127
+ end; self.instance_eval { alias determine_question_answer_from_this return_question_answer_as_array } # === Studium.determine_question_answer_from_this
1128
+ self.instance_eval { alias determine_question_answer_from_this_line return_question_answer_as_array } # === Studium.determine_question_answer_from_this_line
1129
+
1130
+ end
1131
+
1132
+ if __FILE__ == $PROGRAM_NAME
1133
+ Studium::Exams::ExamQuestion.new(ARGV)
1134
+ pp Studium.return_question_answer_as_array(:biotech2)
1135
+ end # rb exam_question.rb amg1