Scraping code and basic view done
This commit is contained in:
commit
eab591188e
2 changed files with 121 additions and 0 deletions
31
index.html
Normal file
31
index.html
Normal file
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<!-- vim: set ts=2 sw=2 et tw=80: -->
|
||||
<html>
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<title>USI INF room checker</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>USI INF room checker</h1>
|
||||
<h4>By maggicl</h4>
|
||||
<section class="times">
|
||||
</section>
|
||||
|
||||
<template id="room">
|
||||
<h2 class="room-title"></h2>
|
||||
<ul class="list"></ul>
|
||||
</template>
|
||||
|
||||
<template id="time-free">
|
||||
<li><strong>Free all day</strong></li>
|
||||
</template>
|
||||
|
||||
<template id="time-slot">
|
||||
<li>
|
||||
<span class="title"></span>
|
||||
(<span class="start"></span>-<span class="end"></span>)
|
||||
</li>
|
||||
</template>
|
||||
<script src='index.js'></script>
|
||||
</body>
|
||||
</html>
|
90
index.js
Normal file
90
index.js
Normal file
|
@ -0,0 +1,90 @@
|
|||
// vim: set ts=2 sw=2 et tw=80:
|
||||
|
||||
function roomStatus(room, callback) {
|
||||
return new Promise((resolve, _) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.addEventListener('load', () => {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(xhr.responseText, 'text/html');
|
||||
const lessons =
|
||||
doc.querySelectorAll('table.rsContentTable div.rsAptSimple');
|
||||
const parsed = [];
|
||||
|
||||
for (let lesson of lessons) {
|
||||
const time = lesson.querySelector('span[id$=lblOrario]');
|
||||
|
||||
const start = new Date();
|
||||
start.setHours(parseInt(time.innerHTML.substring(1,3)));
|
||||
start.setMinutes(parseInt(time.innerHTML.substring(4,6)));
|
||||
start.setSeconds(0);
|
||||
|
||||
const end = new Date();
|
||||
end.setHours(parseInt(time.innerHTML.substring(7,9)));
|
||||
end.setMinutes(parseInt(time.innerHTML.substring(10,12)));
|
||||
end.setSeconds(0);
|
||||
|
||||
parsed.push({
|
||||
title: lesson.getAttribute('title'),
|
||||
start: start,
|
||||
end: end
|
||||
});
|
||||
}
|
||||
|
||||
resolve(parsed);
|
||||
});
|
||||
xhr.open('GET', 'https://aule.usi.ch/aule/View.aspx?name=' + room);
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
|
||||
const ROOMS = [
|
||||
'SI-004',
|
||||
'SI-005',
|
||||
'SI-006',
|
||||
'SI-007',
|
||||
'SI-008',
|
||||
'SI-013',
|
||||
'SI-015'
|
||||
];
|
||||
|
||||
const ROOM_LIST = document.querySelector(".times");
|
||||
const ROOM_TEMPLATE = document.getElementById("room");
|
||||
const SLOT_TEMPLATE = document.getElementById("time-slot");
|
||||
const FREE_SLOT_TEMPLATE = document.getElementById("time-free");
|
||||
|
||||
|
||||
function formatTime(date) {
|
||||
return (date.getHours() < 10 ? '0' : '') + date.getHours() + ':' +
|
||||
(date.getMinutes() < 10 ? '0' : '') + date.getMinutes();
|
||||
}
|
||||
|
||||
async function buildRoomMarkup(roomTitle) {
|
||||
const data = await roomStatus(roomTitle);
|
||||
const room = document.importNode(ROOM_TEMPLATE.content, true);
|
||||
const title = room.querySelector('.room-title');
|
||||
title.innerHTML = roomTitle;
|
||||
const list = room.querySelector('.list');
|
||||
|
||||
for (const d of data) {
|
||||
const slot = document.importNode(SLOT_TEMPLATE.content, true);
|
||||
const title = slot.querySelector('.title');
|
||||
document.getElementById("room");title.innerHTML = d.title;
|
||||
const start = slot.querySelector('.start');
|
||||
start.innerHTML = formatTime(d.start);
|
||||
const end = slot.querySelector('.end');
|
||||
end.innerHTML = formatTime(d.end);
|
||||
list.appendChild(slot);
|
||||
}
|
||||
|
||||
if (data.length == 0) {
|
||||
list.appendChild(document.importNode(FREE_SLOT_TEMPLATE.content, true));
|
||||
}
|
||||
|
||||
ROOM_LIST.appendChild(room);
|
||||
}
|
||||
|
||||
(async function() {
|
||||
for (const room of ROOMS) {
|
||||
await buildRoomMarkup(room);
|
||||
}
|
||||
})()
|
Loading…
Reference in a new issue