aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFinn Behrens <me@kloenk.de>2020-11-08 21:19:47 +0100
committerFinn Behrens <me@kloenk.de>2020-11-08 21:19:47 +0100
commit147cdf67eb4b9049f6a7724cbdd86909bba2f4a7 (patch)
tree783252b6acfb73963bf1ab520e006a911dc16fb1
parenta262ae5c2dca644831db6f2e1cd50b7f4243273c (diff)
downloadbackend-147cdf67eb4b9049f6a7724cbdd86909bba2f4a7.tar.gz
backend-147cdf67eb4b9049f6a7724cbdd86909bba2f4a7.tar.xz
backend-147cdf67eb4b9049f6a7724cbdd86909bba2f4a7.zip
init types
-rw-r--r--Cargo.lock514
-rw-r--r--Cargo.toml8
-rw-r--r--src/dsb/dsb.html306
-rw-r--r--src/dsb/html.rs0
-rw-r--r--src/dsb/mod.rs79
-rw-r--r--src/error.rs11
-rw-r--r--src/lib.rs6
-rw-r--r--src/types.rs345
8 files changed, 1269 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..5a986eb
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,514 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "autocfg"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "backend"
+version = "0.1.0"
+dependencies = [
+ "chrono",
+ "custom_error",
+ "html5ever",
+ "log 0.4.11",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "chrono"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "time",
+ "winapi",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "custom_error"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51ac5e99a7fea3ee8a03fa4721a47e2efd3fbb38358fc61192a54d4c6f866c12"
+
+[[package]]
+name = "debug_unreachable"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3"
+dependencies = [
+ "unreachable",
+]
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
+[[package]]
+name = "futf"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bfb46978eb757a603b7dfe2dafb1c62cb4dee3428d8ac1de734d83d6b022d06"
+dependencies = [
+ "log 0.3.9",
+ "mac",
+ "markup5ever",
+ "quote 0.3.15",
+ "syn",
+]
+
+[[package]]
+name = "lazy_static"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
+
+[[package]]
+name = "libc"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
+
+[[package]]
+name = "log"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
+dependencies = [
+ "log 0.4.11",
+]
+
+[[package]]
+name = "log"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "047150a0e03b57e638fc45af33a0b63a0362305d5b9f92ecef81df472a4cceb0"
+dependencies = [
+ "phf",
+ "phf_codegen",
+ "rustc-serialize",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg 1.0.1",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg 1.0.1",
+]
+
+[[package]]
+name = "phf"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18"
+dependencies = [
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662"
+dependencies = [
+ "phf_shared",
+ "rand",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.7.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
+dependencies = [
+ "unicode-xid 0.2.1",
+]
+
+[[package]]
+name = "quote"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
+
+[[package]]
+name = "quote"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
+dependencies = [
+ "autocfg 0.1.7",
+ "libc",
+ "rand_chacha",
+ "rand_core 0.4.2",
+ "rand_hc",
+ "rand_isaac",
+ "rand_jitter",
+ "rand_os",
+ "rand_pcg",
+ "rand_xorshift",
+ "winapi",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
+dependencies = [
+ "autocfg 0.1.7",
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
+[[package]]
+name = "rand_hc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_isaac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_jitter"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
+dependencies = [
+ "libc",
+ "rand_core 0.4.2",
+ "winapi",
+]
+
+[[package]]
+name = "rand_os"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+dependencies = [
+ "cloudabi",
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.4.2",
+ "rdrand",
+ "winapi",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+dependencies = [
+ "autocfg 0.1.7",
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rustc-serialize"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
+
+[[package]]
+name = "serde"
+version = "1.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
+
+[[package]]
+name = "siphasher"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
+
+[[package]]
+name = "string_cache"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413fc7852aeeb5472f1986ef755f561ddf0c789d3d796e65f0b6fe293ecd4ef8"
+dependencies = [
+ "debug_unreachable",
+ "lazy_static",
+ "phf_shared",
+ "precomputed-hash",
+ "serde",
+ "string_cache_codegen",
+ "string_cache_shared",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote 1.0.7",
+ "string_cache_shared",
+]
+
+[[package]]
+name = "string_cache_shared"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
+
+[[package]]
+name = "syn"
+version = "0.11.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
+dependencies = [
+ "quote 0.3.15",
+ "synom",
+ "unicode-xid 0.0.4",
+]
+
+[[package]]
+name = "synom"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
+dependencies = [
+ "unicode-xid 0.0.4",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi",
+ "winapi",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+
+[[package]]
+name = "unreachable"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"
+dependencies = [
+ "void",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
+
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/Cargo.toml b/Cargo.toml
index 614b369..2e141a6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,4 +6,12 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+[features]
+scraper = []
+default = []
+
[dependencies]
+chrono = { version = "0.4" }
+custom_error = "1.8"
+log = "0.4"
+html5ever = "0.20"
diff --git a/src/dsb/dsb.html b/src/dsb/dsb.html
new file mode 100644
index 0000000..cab5332
--- /dev/null
+++ b/src/dsb/dsb.html
@@ -0,0 +1,306 @@
+<html><head><meta http-equiv="Content-Type" content="text/html;"><style type="text/css">
+
+body { margin-top: 0px; margin-left: 20px; margin-right: 20px;
+background: #fff; color: #272727; font: 80% Arial, Helvetica, sans-serif; }
+
+h1 { color: #ee7f00; font-size: 150%; font-weight: normal;}
+h1 strong { font-size: 200%; font-weight: normal; }
+h2 { font-size: 125%;}
+
+h1, h2 { margin: 0; padding: 0;}
+
+th { background: #000; color: #fff; }
+table.mon_list th, td { padding: 8px 4px;}
+
+
+.mon_title
+{
+ font-weight: bold;
+ font-size: 120%;
+ clear: both;
+ margin: 0;
+}
+
+.inline_header
+{
+ font-weight: bold;
+}
+
+table.info
+{
+ color: #000000;
+ font-size: 100%;
+ border: 1px;
+ border-style:solid;
+ border-collapse:collapse;
+ padding: 8px 4px;
+}
+
+table.mon_list
+{
+ color: #000000;
+ width: 100%;
+ font-size: 100%;
+ border: 1px;
+ border-style:solid;
+ border-collapse:collapse;
+}
+
+table.mon_head
+{
+ color: #000000;
+ width: 100%;
+ font-size: 100%;
+}
+
+td.info,
+th.list,
+td.list,
+tr.list
+{
+ border: 1px;
+ border-style: solid;
+ border-color: black;
+ margin: 0px;
+ border-collapse:collapse;
+ padding: 3px;
+}
+
+tr.odd { background: #fad3a6; }
+tr.even { background: #fdecd9; }
+
+</style></head><body ><body>
+<table class="mon_head">
+ <tr>
+ <td valign="bottom"><h1><strong>Untis</strong> 2019 <!-- Info-Stundenplan --></h1></td>
+ <td valign="bottom"></td>
+ <td align="right" valign="bottom">
+ <p>LANDRAT-LUCAS-SCH.LEVERKUSEN <span style="width:10px">&nbsp;</span> D-51379,P.-NEUENHEUSER-STR.7<br />
+ Schuljahr 2018/19<span style="width:10px">&nbsp;</span>gültig ab 13.05.2019 <span style="width:10px">&nbsp;</span> Stand: 05.07.2019 07:41</p>
+ </td>
+ </tr>
+</table>
+
+<center>
+<div class="mon_title">5.7.2019 Freitag, Woche B</div>
+<table class="info" >
+<tr class="info"><th class="info" align="center" colspan="2">Nachrichten zum Tag</th></tr>
+<tr class="info"><td class="info" align="left">Abwesende Lehrer&nbsp;</td><td class="info" align="left">ALEP, BERG, BOES, DAN (1-6), FLUE, FOM, FORM (1-7), GFD (1-2), GM, HAL2, HAUB, HEC, KAHN (4-4), KENT, KLCK, KOC, KOP, KOWA, KRD, MON, NET, NOB, PNSK, RCK, RICK (3-3), SNET, TELM, TRI, TSA, WEST, WEY</td></tr>
+<tr class="info"><td class="info" align="left">Blockierte Räume&nbsp;</td><td class="info" align="left">A218, A134 (2-2), A134 (3-4)</td></tr>
+<tr class="info"><td class="info" align="left">Betroffene Klassen&nbsp;</td><td class="info" align="left">5a, 5c, 5e, 6a, 6c, 6e, 7a, 7b, 7c, 7d, 7e, 7f, 8a, 8b, 8c, 8d, 8e, 8f, 9b, 9d, 9e, EF, Q1, BS, SPI, AG</td></tr>
+</table>
+<p>
+<table class="mon_list" >
+<tr class='list'><th class="list" align="center" width='7'>Klasse</th><th class="list" align="center" width='9'><b>Stunde</b></th><th class="list" align="center" width='8'><b>Vertreter</b></th><th class="list" align="center" width='9'>Fach</th><th class="list" align="center" width='6'>(Fach)</th><th class="list" align="center" width='29'>Bemerkung</th><th class="list" align="center" width='12'>Art</th><th class="list" align="center" width='6'><b>Raum</b></th></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >5a</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >5a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>OTT</b></td><td class="list" align="center" style="background-color: #FFFFFF" >BI</td><td class="list" align="center" style="background-color: #FFFFFF" >BI</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A114</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >5a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SNEI</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BAD1</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >5a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>FRA</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BAD</b></td></tr>
+<tr class='list odd'><td class="list" align="center">5a</td><td class="list" align="center"><b>3 - 4</b></td><td class="list" align="center"><b>SNEI</b></td><td class="list" align="center">SN</td><td class="list" align="center">SN</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>BAD</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >5c</td></tr>
+<tr class='list odd'><td class="list" align="center">5c</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>BLE</b></td><td class="list" align="center">SN</td><td class="list" align="center">SN</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>D002</b></td></tr>
+<tr class='list even'><td class="list" align="center">5c</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>BLE</b></td><td class="list" align="center">SN</td><td class="list" align="center">SN</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>D002</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >5c</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BLE</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>D002</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >5e</td></tr>
+<tr class='list odd'><td class="list" align="center">5e</td><td class="list" align="center"><b>5 - 6</b></td><td class="list" align="center"><b>FRA</b></td><td class="list" align="center">SN</td><td class="list" align="center">SN</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>D001</b></td></tr>
+<tr class='list even'><td class="list" align="center">5e</td><td class="list" align="center"><b>5 - 6</b></td><td class="list" align="center"><b>FRA</b></td><td class="list" align="center">SN</td><td class="list" align="center">SN</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>D001</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >5e</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>FRA</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>D001</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >6a</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >6a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>ZUB</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP</td><td class="list" align="center" style="background-color: #FFFFFF" >SP</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B106</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >6c</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >6c</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>MAZ</b></td><td class="list" align="center" style="background-color: #FFFFFF" >BI</td><td class="list" align="center" style="background-color: #FFFFFF" >M</td><td class="list" align="center" style="background-color: #FFFFFF" >Biologie statt Mathe</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A118</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >6e</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >6e</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HRB</b></td><td class="list" align="center" style="background-color: #FFFFFF" >MU</td><td class="list" align="center" style="background-color: #FFFFFF" >MU</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B013</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >6e</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HRB</b></td><td class="list" align="center" style="background-color: #FFFFFF" >E</td><td class="list" align="center" style="background-color: #FFFFFF" >E</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B013</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >6e</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HRB</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP</td><td class="list" align="center" style="background-color: #FFFFFF" >SP</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B105</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >7a</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BRU</b></td><td class="list" align="center" style="background-color: #FFFFFF" >M</td><td class="list" align="center" style="background-color: #FFFFFF" >M</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B203</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >7a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>KAMP</b></td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" align="center" style="background-color: #FFFFFF" >EVA: Aufgabe bereits</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B203</b></td></tr>
+<tr class='list odd'><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >gestellt.</td><td class="list" align="center">&nbsp;</td><td class="list" align="center">&nbsp;</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >7a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>DUB</b></td><td class="list" align="center" style="background-color: #FFFFFF" >F6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >F6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B203</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7ad</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>DEMR</b></td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B005</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >7b</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7b</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BLE</b></td><td class="list" align="center" style="background-color: #FFFFFF" >EK</td><td class="list" align="center" style="background-color: #FFFFFF" >EK</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B204</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >7c</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7ce</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BKY</b></td><td class="list" align="center" style="background-color: #FFFFFF" >L6-3</td><td class="list" align="center" style="background-color: #FFFFFF" >L6-3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B002</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >7d</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7d</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>KAHN</b></td><td class="list" align="center" style="background-color: #FFFFFF" >E</td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B208</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >7d</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BSCH</b></td><td class="list" align="center" style="background-color: #FFFFFF" >E</td><td class="list" align="center" style="background-color: #FFFFFF" >E</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B208</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7ad</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>DEMR</b></td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B005</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >7e</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7ce</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BKY</b></td><td class="list" align="center" style="background-color: #FFFFFF" >L6-3</td><td class="list" align="center" style="background-color: #FFFFFF" >L6-3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B002</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >7f</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >7f</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >FD-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >8a</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8ab</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HAY</b></td><td class="list" align="center" style="background-color: #FFFFFF" >F6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >F6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A102</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >8ab</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BKY</b></td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A006</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8ab</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SCHT</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-2</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-2</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A010</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >8a</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BL</b></td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A102</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >8b</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >8ab</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HAY</b></td><td class="list" align="center" style="background-color: #FFFFFF" >F6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >F6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A102</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8ab</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BKY</b></td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" align="center" style="background-color: #FFFFFF" >L6-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A006</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >8ab</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SCHT</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-2</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-2</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A010</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8be</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BOR</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-4</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-4</td><td class="list" align="center" style="background-color: #FFFFFF" >im Physikraum</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B122</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >8c</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8cd</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>FRA</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-3</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>D001</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >8cd</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SIL</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-6</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-6</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A003</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8c</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>KOW</b></td><td class="list" align="center" style="background-color: #FFFFFF" >GE</td><td class="list" align="center" style="background-color: #FFFFFF" >GE</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B110</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >8d</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8cd</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>FRA</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-3</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>D001</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >8cd</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SIL</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-6</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-6</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vtr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A003</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8d</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SCHT</b></td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" align="center" style="background-color: #FFFFFF" >D</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B202</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >8e</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8be</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BOR</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SP-4</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-4</td><td class="list" align="center" style="background-color: #FFFFFF" >im Physikraum</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B122</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >8f</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >8f</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >FF-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >9b</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >9bde</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>VED</b></td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >EVA: spanische Lieder singen</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B012</b></td></tr>
+<tr class='list even'><td class="list" align="center">9bde</td><td class="list" align="center"><b>5 - 6</b></td><td class="list" align="center"><b>BSCH</b></td><td class="list" align="center">TH-2</td><td class="list" align="center">TH-2</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>AULA</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >9bde</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>VED</b></td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B012</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >9d</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >9d</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>DUB</b></td><td class="list" align="center" style="background-color: #FFFFFF" >BIe</td><td class="list" align="center" style="background-color: #FFFFFF" >BIe</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A117</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >9bde</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>VED</b></td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >EVA: spanische Lieder singen</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B012</b></td></tr>
+<tr class='list odd'><td class="list" align="center">9bde</td><td class="list" align="center"><b>5 - 6</b></td><td class="list" align="center"><b>BSCH</b></td><td class="list" align="center">TH-2</td><td class="list" align="center">TH-2</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>AULA</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >9bde</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>VED</b></td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B012</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >9e</td></tr>
+<tr class='list even'><td class="list" align="center">9e</td><td class="list" align="center"><b>3 - 4</b></td><td class="list" align="center"><b>BL</b></td><td class="list" align="center">ER-1</td><td class="list" align="center">ER-1</td><td class="list">&nbsp;</td><td class="list" align="center">Unterricht geändert</td><td class="list" align="center"><b>A006</b></td></tr>
+<tr class='list odd'><td class="list" align="center">9e</td><td class="list" align="center"><b>3 - 4</b></td><td class="list" align="center"><b>ZIM</b></td><td class="list" align="center">KR-1</td><td class="list" align="center">KR-1</td><td class="list">&nbsp;</td><td class="list" align="center">Unterricht geändert</td><td class="list" align="center"><b>A006</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >9bde</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>VED</b></td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >EVA: spanische Lieder singen</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B012</b></td></tr>
+<tr class='list odd'><td class="list" align="center">9bde</td><td class="list" align="center"><b>5 - 6</b></td><td class="list" align="center"><b>BSCH</b></td><td class="list" align="center">TH-2</td><td class="list" align="center">TH-2</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>AULA</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >9bde</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>VED</b></td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" align="center" style="background-color: #FFFFFF" >S8-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B012</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >EF</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BRT</b></td><td class="list" align="center" style="background-color: #FFFFFF" >ER-GK1</td><td class="list" align="center" style="background-color: #FFFFFF" >ER-GK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A212</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >PS-GK3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >BI-GK5</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >F6-GK2</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >PH-GK3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >M-GK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >M-GK5</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HAHN</b></td><td class="list" align="center" style="background-color: #FFFFFF" >BI-GK4</td><td class="list" align="center" style="background-color: #FFFFFF" >BI-GK4</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A114</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >Q1</td></tr>
+<tr class='list odd'><td class="list" align="center">Q1</td><td class="list" align="center"><b>1</b></td><td class="list" align="center"><b>KD</b></td><td class="list" align="center">CH-LK1</td><td class="list" align="center">CH-LK1</td><td class="list" align="center">Start um 8.25 Uhr!</td><td class="list" align="center">Unterricht geändert</td><td class="list" align="center"><b>A317</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>HSR</b></td><td class="list" align="center" style="background-color: #FFFFFF" >D-LK3</td><td class="list" align="center" style="background-color: #FFFFFF" >D-LK3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B006</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>1 - 2</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >SP-LK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>SWZ</b></td><td class="list" align="center" style="background-color: #FFFFFF" >GE-GK1</td><td class="list" align="center" style="background-color: #FFFFFF" >GE-GK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A224</b></td></tr>
+<tr class='list odd'><td class="list" align="center">Q1</td><td class="list" align="center"><b>3 - 4</b></td><td class="list" align="center"><b>RF</b></td><td class="list" align="center">KR-GK1</td><td class="list" align="center">KR-GK1</td><td class="list">&nbsp;</td><td class="list" align="center">Betreuung</td><td class="list" align="center"><b>A229</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >M-GK9</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>RF</b></td><td class="list" align="center" style="background-color: #FFFFFF" >D-LK4</td><td class="list" align="center" style="background-color: #FFFFFF" >D-LK4</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A229</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >E-LK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BRNK</b></td><td class="list" align="center" style="background-color: #FFFFFF" >M-LK1</td><td class="list" align="center" style="background-color: #FFFFFF" >M-LK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Raum</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>A106</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >D-GK6</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >GE-GK2</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >KD-GK1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >Q1</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >PS-GK3</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >BS</td></tr>
+<tr class='list odd'><td class="list" align="center">BS</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center">BS</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center">BS</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center">BS</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center">BS</td><td class="list" align="center"><b>3 - 4</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center">BS</td><td class="list" align="center"><b>3 - 4</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center">BS</td><td class="list" align="center"><b>5 - 6</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list even'><td class="list" align="center">BS</td><td class="list" align="center"><b>7</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >SPI</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >SPI</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>8 - 10</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >Sp_Int</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >SPI</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>8 - 10</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >Sp_Int</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >AG</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >AG</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7 - 8</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >AG-NW4</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+</table>
+<p>
+<font size="3" face="Arial">
+ B 2. HJ 18/19 4. Quartal
+</font></center>
+
+<p><center><font face="Arial" size="2"><a href="http://www.untis.at" target="_blank" >Untis Stundenplan Software</a></font></center>
+
+
+
+
+
+
+<body>
+<table class="mon_head">
+ <tr>
+ <td valign="bottom"><h1><strong>Untis</strong> 2019 <!-- Info-Stundenplan --></h1></td>
+ <td valign="bottom"></td>
+ <td align="right" valign="bottom">
+ <p>LANDRAT-LUCAS-SCH.LEVERKUSEN <span style="width:10px">&nbsp;</span> D-51379,P.-NEUENHEUSER-STR.7<br />
+ Schuljahr 2018/19<span style="width:10px">&nbsp;</span>gültig ab 13.05.2019 <span style="width:10px">&nbsp;</span> Stand: 05.07.2019 07:41</p>
+ </td>
+ </tr>
+</table>
+
+<center>
+<div class="mon_title">8.7.2019 Montag, Woche A</div>
+<table class="info" >
+<tr class="info"><th class="info" align="center" colspan="2">Nachrichten zum Tag</th></tr>
+<tr class="info"><td class="info" align="left">Abwesende Lehrer&nbsp;</td><td class="info" align="left">BOES, HEC, HW, KOC, SNET</td></tr>
+<tr class="info"><td class="info" align="left">Betroffene Klassen&nbsp;</td><td class="info" align="left">EF</td></tr>
+</table>
+<p>
+<table class="mon_list" >
+<tr class='list'><th class="list" align="center" width='7'>Klasse</th><th class="list" align="center" width='9'><b>Stunde</b></th><th class="list" align="center" width='8'><b>Vertreter</b></th><th class="list" align="center" width='9'>Fach</th><th class="list" align="center" width='6'>(Fach)</th><th class="list" align="center" width='29'>Bemerkung</th><th class="list" align="center" width='12'>Art</th><th class="list" align="center" width='6'><b>Raum</b></th></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >EF</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >EF</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td><td class="list" align="center" style="background-color: #FFFFFF" >---</td><td class="list" align="center" style="background-color: #FFFFFF" >PS-GK6</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >entfälllt</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>---</b></td></tr>
+</table>
+<p>
+<font size="3" face="Arial">
+ A 2. HJ 18/19 4. Quartal
+</font></center>
+
+<p><center><font face="Arial" size="2"><a href="http://www.untis.at" target="_blank" >Untis Stundenplan Software</a></font></center>
+</body>
+
+
+
+
+
+
+<table class="mon_head">
+ <tr>
+ <td valign="bottom"><h1><strong>Untis</strong> 2019 <!-- Info-Stundenplan --></h1></td>
+ <td valign="bottom"></td>
+ <td align="right" valign="bottom">
+ <p>LANDRAT-LUCAS-SCH.LEVERKUSEN <span style="width:10px">&nbsp;</span> D-51379,P.-NEUENHEUSER-STR.7<br />
+ Schuljahr 2018/19<span style="width:10px">&nbsp;</span>gültig ab 13.05.2019 <span style="width:10px">&nbsp;</span> Stand: 05.07.2019 07:41</p>
+ </td>
+ </tr>
+</table>
+
+<center>
+<div class="mon_title">9.7.2019 Dienstag, Woche A</div>
+<table class="info" >
+<tr class="info"><th class="info" align="center" colspan="2">Nachrichten zum Tag</th></tr>
+<tr class="info"><td class="info" align="left">Abwesende Lehrer&nbsp;</td><td class="info" align="left">BOES, HEC, KOC, SNET</td></tr>
+<tr class="info"><td class="info" align="left">Betroffene Klassen&nbsp;</td><td class="info" align="left">5f, 6c, 7a, 7e, 7f, BS, VBS, AG</td></tr>
+</table>
+<p>
+<table class="mon_list" >
+<tr class='list'><th class="list" align="center" width='7'>Klasse</th><th class="list" align="center" width='9'><b>Stunde</b></th><th class="list" align="center" width='8'><b>Vertreter</b></th><th class="list" align="center" width='9'>Fach</th><th class="list" align="center" width='6'>(Fach)</th><th class="list" align="center" width='29'>Bemerkung</th><th class="list" align="center" width='12'>Art</th><th class="list" align="center" width='6'><b>Raum</b></th></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >5f</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >5f</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" align="center" style="background-color: #FFFFFF" >SN</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>BAD1</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >6c</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >6c</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>3 - 4</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >F6-2</td><td class="list" align="center" style="background-color: #FFFFFF" >F6-2</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B108</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >7a</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >7aef</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >PP-1</td><td class="list" align="center" style="background-color: #FFFFFF" >PP-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B203</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >7e</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >7aef</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >PP-1</td><td class="list" align="center" style="background-color: #FFFFFF" >PP-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B203</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >7f</td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >7aef</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>5 - 6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >PP-1</td><td class="list" align="center" style="background-color: #FFFFFF" >PP-1</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>B203</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >BS</td></tr>
+<tr class='list even'><td class="list" align="center">BS</td><td class="list" align="center"><b>1 - 2</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">BS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list odd'><td class="list inline_header" colspan="8" >VBS</td></tr>
+<tr class='list even'><td class="list" align="center">VBS</td><td class="list" align="center"><b>1</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">VBS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list odd'><td class="list" align="center">VBS</td><td class="list" align="center"><b>2</b></td><td class="list" align="center"><b>---</b></td><td class="list" align="center">---</td><td class="list" align="center">VBS</td><td class="list">&nbsp;</td><td class="list" align="center">Bereitschaft entfällt</td><td class="list" align="center"><b>---</b></td></tr>
+<tr class='list even'><td class="list inline_header" colspan="8" >AG</td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >AG</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>6</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >AG-Z</td><td class="list" align="center" style="background-color: #FFFFFF" >AG-Z</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>C001</b></td></tr>
+<tr class='list even'><td class="list" align="center" style="background-color: #FFFFFF" >AG</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>7</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >AG-Z</td><td class="list" align="center" style="background-color: #FFFFFF" >AG-Z</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>C001</b></td></tr>
+<tr class='list odd'><td class="list" align="center" style="background-color: #FFFFFF" >AG</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>8</b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b>???</b></td><td class="list" align="center" style="background-color: #FFFFFF" >AG-Z</td><td class="list" align="center" style="background-color: #FFFFFF" >AG-Z</td><td class="list" style="background-color: #FFFFFF" >&nbsp;</td><td class="list" align="center" style="background-color: #FFFFFF" >Vertr.</td><td class="list" align="center" style="background-color: #FFFFFF" ><b>C001</b></td></tr>
+</table>
+<p>
+<font size="3" face="Arial">
+ A 2. HJ 18/19 4. Quartal
+</font></center>
+
+<p><center><font face="Arial" size="2"><a href="http://www.untis.at" target="_blank" >Untis Stundenplan Software</a></font></center>
+</body></body></html> \ No newline at end of file
diff --git a/src/dsb/html.rs b/src/dsb/html.rs
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/dsb/html.rs
diff --git a/src/dsb/mod.rs b/src/dsb/mod.rs
new file mode 100644
index 0000000..7a32c1f
--- /dev/null
+++ b/src/dsb/mod.rs
@@ -0,0 +1,79 @@
+use crate::types::*;
+use crate::Error;
+
+use html5ever::parse_document;
+use html5ever::rcdom::RcDom;
+use html5ever::tendril::TendrilSink;
+
+mod html;
+
+#[cfg(feature = "scraper")]
+use hyper::Client;
+
+pub struct DSB {
+ pub school: String,
+ pub year: String,
+ pub valid_from: chrono::NaiveDate,
+ pub updated_at: chrono::NaiveDateTime,
+ pub date: chrono::NaiveDate,
+ pub week: Week,
+ pub free_lessons: Option<String>,
+ pub missing_teachers: Vec<Teacher>,
+ pub blocked_rooms: Vec<Room>,
+ pub affected_classes: Vec<Class>,
+ pub entries: Vec<DsbEntry>,
+}
+
+impl DSB {
+ /// parse dsb content
+ pub fn parse(html: &str) -> Result<Vec<DSB>, Error> {
+ let html = html.replace("&nbsp;", " "); // FIXME: ???
+ let dom = parse_document(RcDom::default(), Default::default())
+ .from_utf8()
+ .read_from(&mut html.as_bytes())?;
+
+
+ todo!()
+ }
+}
+
+/// Default DSB url
+#[cfg(feature = "scraper")]
+pub const DSB_BASE_URL: &'static str = "https://dsbmobile.de/";
+
+/// Config struct for dsb
+#[cfg(feature = "scraper")]
+pub struct DsbConfig<'a> {
+ pub user_id: &'a str,
+ pub password: &'a str,
+ pub cookie: &'a str,
+
+ pub base_url: &'static str,
+
+ // TODO: "scraper" time behind a feature
+ #[cfg(feature = "hyper")] //TODO
+ pub hyper: &'a Client,
+}
+
+#[cfg(feature = "scraper")]
+impl<'a> DsbConfig<'a> {
+ pub fn new(user_id: &'a str, password: &'a str, cookie: &'a str) -> Self {
+ Self {
+ user_id,
+ password,
+ cookie,
+
+ base_url: DSB_BASE_URL,
+ }
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::DSB;
+ #[test]
+ fn read_dsb() {
+ let html = std::fs::read_to_string("./src/dsb/mod.rs").unwrap();
+ let dsb = DSB::parse(&html).unwrap();
+ }
+}
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..45fef70
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,11 @@
+use custom_error::custom_error;
+
+custom_error! { pub Error
+ DsbInvalidWeek{ value: String } = "Week {value} is invalid",
+ DsbInvalidHour{ value: String } = "Hour {value} is invalid",
+ InvalidRoom{ value: String } = "Room {value} is invalid",
+ InvalidCourse { value: String} = "Course {value} is invalid",
+
+ Parse{ source: std::num::ParseIntError } = "Parser: {source}",
+ Io{source: std::io::Error } = "IO: {source}"
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..22a4ac8
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,6 @@
+pub mod dsb;
+
+pub mod types;
+
+mod error;
+pub use error::Error;
diff --git a/src/types.rs b/src/types.rs
new file mode 100644
index 0000000..d0f17fa
--- /dev/null
+++ b/src/types.rs
@@ -0,0 +1,345 @@
+use std::convert::TryFrom;
+use std::fmt;
+
+use crate::Error;
+
+#[repr(u8)]
+#[derive(Debug, Clone, PartialEq)]
+pub enum Week {
+ A,
+ B,
+}
+
+impl TryFrom<char> for Week {
+ type Error = Error;
+
+ fn try_from(value: char) -> Result<Self, Self::Error> {
+ let value = value.to_uppercase().to_string();
+ match value.as_str() {
+ "A" => Ok(Week::A),
+ "B" => Ok(Week::B),
+ _ => Err(Error::DsbInvalidWeek { value }),
+ }
+ }
+}
+
+impl TryFrom<&str> for Week {
+ type Error = Error;
+
+ fn try_from(value: &str) -> Result<Self, Self::Error> {
+ let value = value.to_uppercase().to_string();
+ match value.as_str() {
+ "A" => Ok(Week::A),
+ "B" => Ok(Week::B),
+ _ => Err(Error::DsbInvalidWeek { value }),
+ }
+ }
+}
+
+#[derive(Clone)]
+pub struct Class {
+ pub name: String,
+}
+
+impl fmt::Debug for Class {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "Class {{ {} }}", self)
+ }
+}
+
+impl fmt::Display for Class {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", self.name)
+ }
+}
+
+#[derive(Debug, Eq, PartialEq, Clone)]
+pub enum Hour {
+ Part(u8),
+ Block(u8, u8),
+}
+
+impl TryFrom<&str> for Hour {
+ type Error = Error;
+
+ fn try_from(value: &str) -> Result<Self, Self::Error> {
+ if value.contains('-') {
+ let vec: Vec<&str> = value.split('-').map(|v| v.trim()).collect();
+ if vec.len() != 2 {
+ return Err(Error::DsbInvalidHour {
+ value: value.to_string(),
+ });
+ }
+ Ok(Hour::Block(vec[0].parse()?, vec[1].parse()?))
+ } else {
+ Ok(Hour::Part(value.parse()?))
+ }
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub enum Kind {
+ None,
+ Substitution,
+ Dropped,
+ Special,
+ Changed,
+ Room,
+ Unknown(String),
+}
+
+impl From<&str> for Kind {
+ fn from(value: &str) -> Self {
+ match value.to_lowercase().as_str() {
+ "vertr" => Kind::Substitution,
+ "entfällt" | "entf\\u{fffd}lllt" => Kind::Dropped,
+ "sondereins" => Kind::Special,
+ "geändert" | "ge\\u{fffd}ndert" => Kind::Changed,
+ "betreuung" => Kind::Special,
+ "raum" => Kind::Room,
+ v @ _ => {
+ log::info!("could not parse kind {}", v);
+ Kind::Unknown(v.to_string())
+ }
+ }
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum Room {
+ A(u16),
+ B(u16),
+ C(u16),
+ D(u16),
+ E(u16),
+ Multi(Vec<Room>),
+}
+
+// used to get room from byte arry
+pub(crate) fn get_room_num(value: &[u8]) -> u16 {
+ let mut ret = 0;
+ for x in 0..value.len() {
+ ret += (value[x] as u16 - 48) * (10u16.pow((value.len() - 1 - x) as u32));
+ }
+
+ ret
+}
+
+impl TryFrom<&str> for Room {
+ type Error = Error;
+
+ fn try_from(value: &str) -> Result<Self, Self::Error> {
+ let value = value.trim();
+ if value.contains(',') {
+ let value = value
+ .split(',')
+ .map(|v| Room::try_from(v))
+ .collect::<Result<Vec<Self>, Self::Error>>()?;
+ return Ok(Room::Multi(value));
+ }
+ let cvalue = value.as_bytes();
+ if cvalue.len() != 4 {
+ return Err(Error::InvalidRoom {
+ value: value.to_string(),
+ });
+ }
+ match cvalue[0] as char {
+ 'A' => Ok(Room::A(get_room_num(&cvalue[1..]))),
+ 'B' => Ok(Room::B(get_room_num(&cvalue[1..]))),
+ 'C' => Ok(Room::C(get_room_num(&cvalue[1..]))),
+ 'D' => Ok(Room::D(get_room_num(&cvalue[1..]))),
+ 'E' => Ok(Room::E(get_room_num(&cvalue[1..]))),
+ _ => Err(Error::InvalidRoom {
+ value: value.to_string(),
+ }),
+ }
+ }
+}
+
+impl fmt::Display for Room {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Room::A(v) => write!(f, "A{}", v),
+ Room::B(v) => write!(f, "B{}", v),
+ Room::C(v) => write!(f, "C{}", v),
+ Room::D(v) => write!(f, "D{}", v),
+ Room::E(v) => write!(f, "E{}", v),
+ Room::Multi(v) => write!(
+ f,
+ "{}",
+ v.iter()
+ .map(|v| v.to_string())
+ .collect::<Vec<String>>()
+ .join(",")
+ ),
+ }
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum Course {
+ Sec1(String),
+ Sec2 {
+ name: String,
+ track: Option<u8>,
+ kind: CourseKind,
+ },
+ // Sec2Exam??
+}
+
+impl Course {
+ pub fn parse_sec2(value: &str) -> Result<Self, Error> {
+ let vvalue = value.split('-').map(|v| v.trim()).collect::<Vec<&str>>();
+ if vvalue.len() != 2 {
+ return Err(Error::InvalidCourse {
+ value: value.to_string(),
+ });
+ }
+
+ let name = vvalue[0].to_string();
+ let kind = CourseKind::try_from(vvalue[1])?;
+
+ Ok(Self::Sec2 {
+ name,
+ kind,
+ track: None,
+ })
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum CourseKind {
+ GK(u8),
+ LK(u8),
+}
+
+impl TryFrom<&str> for CourseKind {
+ type Error = Error;
+
+ fn try_from(value: &str) -> Result<Self, Self::Error> {
+ let cvalue = value.as_bytes();
+ if cvalue.len() != 3 {
+ return Err(Error::InvalidCourse {
+ value: value.to_string(),
+ });
+ }
+
+ let v = cvalue[2] as u8 - 48;
+ if value.starts_with("GK") {
+ Ok(CourseKind::GK(v))
+ } else if value.starts_with("LK") {
+ Ok(CourseKind::LK(v))
+ } else {
+ Err(Error::InvalidCourse {
+ value: value.to_string(),
+ })
+ }
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct Teacher {
+ pub name: String,
+}
+
+#[derive(Debug, Clone)]
+pub struct DsbEntry {
+ /// Class this one affects
+ pub name: String, // TODO: change to enum type
+
+ /// New course if any
+ pub new_course: Option<Course>,
+
+ /// The course this one alters
+ pub old_course: Course,
+
+ /// Hour for this entry
+ pub hour: Hour,
+
+ /// New Teacher for this entry
+ pub new_teacher: Option<Teacher>,
+
+ /// Message for this enrty
+ pub message: Option<String>,
+
+ /// Kind of this entry
+ pub kind: Kind,
+
+ /// New room for this entry
+ pub room: Option<Room>,
+}
+
+#[cfg(test)]
+mod test {
+ use super::{TryFrom, Week};
+
+ #[test]
+ fn week_try_from() {
+ let week = Week::try_from('B').unwrap();
+ assert_eq!(week, Week::B);
+
+ let week = Week::try_from("A").unwrap();
+ assert_eq!(week, Week::A);
+ }
+
+ #[test]
+ fn hour_try_from() {
+ use super::Hour;
+ let hour = Hour::try_from("1").unwrap();
+ assert_eq!(hour, Hour::Part(1));
+
+ let hour = Hour::try_from("3 - 4").unwrap();
+ assert_eq!(hour, Hour::Block(3, 4));
+ }
+
+ #[test]
+ fn room_try_from() {
+ use super::Room;
+ let room = Room::try_from("A303").unwrap();
+ assert_eq!(room, Room::A(303));
+
+ let room = Room::try_from("B008").unwrap();
+ assert_eq!(room, Room::B(8));
+
+ let room = Room::try_from("A211,A212").unwrap();
+ assert_eq!(room, Room::Multi(vec![Room::A(211), Room::A(212)]));
+ }
+
+ #[test]
+ fn course_try_from() {
+ use super::{Course, CourseKind};
+ let course = Course::parse_sec2("IF-LK1").unwrap();
+ if let Course::Sec2 { name, track, kind } = course {
+ assert_eq!(&name, "IF");
+ assert_eq!(kind, CourseKind::LK(1));
+ assert!(track.is_none());
+ } else {
+ panic!("failed");
+ }
+
+ let course = Course::parse_sec2("D-GK6").unwrap();
+ if let Course::Sec2 { name, track, kind } = course {
+ assert_eq!(&name, "D");
+ assert_eq!(kind, CourseKind::GK(6));
+ assert!(track.is_none());
+ } else {
+ panic!("failed");
+ }
+ }
+
+ #[test]
+ fn kind_from() {
+ use super::Kind;
+ let kind = Kind::from("vertr");
+ assert_eq!(kind, Kind::Substitution);
+ }
+
+ #[test]
+ fn get_from_arry() {
+ let three = super::get_room_num("3".as_bytes());
+ assert_eq!(three, 3);
+
+ let v = super::get_room_num("301".as_bytes());
+ assert_eq!(v, 301);
+ }
+}