Spaces:
Sleeping
Sleeping
Create contentModel.js
Browse files- contentModel.js +58 -0
contentModel.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const cheerio = require('cheerio');
|
| 2 |
+
|
| 3 |
+
const cleanText = (text) => text.replace(/\s+/g, ' ').trim();
|
| 4 |
+
|
| 5 |
+
module.exports.parseStudentData = (html, regNo) => {
|
| 6 |
+
const $ = cheerio.load(html);
|
| 7 |
+
const getText = selector => cleanText($(selector).text()) || 'N/A';
|
| 8 |
+
|
| 9 |
+
// Base information
|
| 10 |
+
const data = {
|
| 11 |
+
university: "Bihar Engineering University, Patna",
|
| 12 |
+
registration_no: regNo,
|
| 13 |
+
exam_name: getText('#ContentPlaceHolder1_DataList4_Exam_Name_0'),
|
| 14 |
+
semester: getText('#ContentPlaceHolder1_DataList2_Exam_Name_0'),
|
| 15 |
+
exam_date: getText('#ContentPlaceHolder1_DataList2 td:nth-of-type(2)').split(':').pop(),
|
| 16 |
+
student_name: getText('#ContentPlaceHolder1_DataList1_StudentNameLabel_0'),
|
| 17 |
+
college_name: getText('#ContentPlaceHolder1_DataList1_CollegeNameLabel_0'),
|
| 18 |
+
course_name: getText('#ContentPlaceHolder1_DataList1_CourseLabel_0'),
|
| 19 |
+
sgpa: getText('#ContentPlaceHolder1_DataList5_GROSSTHEORYTOTALLabel_0'),
|
| 20 |
+
publish_date: getText('#ContentPlaceHolder1_DataList3 tr:nth-of-type(2) td').split(':').pop()
|
| 21 |
+
};
|
| 22 |
+
|
| 23 |
+
// Subject parser
|
| 24 |
+
const parseSubjects = (selector) => {
|
| 25 |
+
return $(`${selector} tr`).slice(1).map((i, row) => {
|
| 26 |
+
const cells = $(row).find('td');
|
| 27 |
+
return cells.length >= 7 ? {
|
| 28 |
+
subject_code: cleanText(cells.eq(0).text()),
|
| 29 |
+
subject_name: cleanText(cells.eq(1).text()),
|
| 30 |
+
ese: cleanText(cells.eq(2).text()),
|
| 31 |
+
ia: cleanText(cells.eq(3).text()),
|
| 32 |
+
total: cleanText(cells.eq(4).text()),
|
| 33 |
+
grade: cleanText(cells.eq(5).text()),
|
| 34 |
+
credit: cleanText(cells.eq(6).text())
|
| 35 |
+
} : null;
|
| 36 |
+
}).get().filter(Boolean);
|
| 37 |
+
};
|
| 38 |
+
|
| 39 |
+
// Subjects and grades
|
| 40 |
+
data.theory_subjects = parseSubjects('#ContentPlaceHolder1_GridView1');
|
| 41 |
+
data.practical_subjects = parseSubjects('#ContentPlaceHolder1_GridView2');
|
| 42 |
+
|
| 43 |
+
// Semester grades
|
| 44 |
+
data.semester_grades = $('#ContentPlaceHolder1_GridView3 tr:nth-child(2) td')
|
| 45 |
+
.map((i, cell) => ({
|
| 46 |
+
semester: ["sgpa", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "Cur. CGPA"][i],
|
| 47 |
+
sgpa: cleanText($(cell).text())
|
| 48 |
+
})).get();
|
| 49 |
+
|
| 50 |
+
// Failed subjects
|
| 51 |
+
const failedSubjects = [
|
| 52 |
+
...data.theory_subjects.filter(s => s.grade === 'F').map(s => s.subject_name),
|
| 53 |
+
...data.practical_subjects.filter(s => s.grade === 'F').map(s => `${s.subject_name} (Practical)`)
|
| 54 |
+
];
|
| 55 |
+
data.remarks = failedSubjects.length ? `FAIL: ${failedSubjects.join(', ')}` : 'Pass';
|
| 56 |
+
|
| 57 |
+
return data;
|
| 58 |
+
};
|