UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

98 lines (97 loc) 4.11 kB
import { HttpSource } from "../HttpSource.js"; import { UrlUtil } from "../../../util/index.js"; import { JSDOM } from "jsdom"; import { Level2Date as EdtfDate, Level2Timeshift } from "@rr0/time"; import assert from "assert"; import { BaseOvniFranceDatasource } from "./BaseOvniFranceDatasource.js"; var ListType; (function (ListType) { ListType[ListType["perMonth"] = 20] = "perMonth"; })(ListType || (ListType = {})); var Cre; (function (Cre) { Cre[Cre["export"] = 1] = "export"; })(Cre || (Cre = {})); export class BaseOvniFranceHttpDatasource extends BaseOvniFranceDatasource { constructor(baseUrl = new URL("http://baseovnifrance.free.fr"), searchPath = "listgen.php") { super(); this.baseUrl = baseUrl; this.searchPath = searchPath; this.http = new HttpSource(); } queryUrl(context) { const time = context.time; const day = time.getDayOfMonth(); const month = time.getMonth(); const year = time.getYear(); const queryParams = { typlist: ListType.perMonth, page: 0 }; const queryParamsStr = UrlUtil.objToQueryParams(queryParams); const formData = { mois: String(month).padStart(2, "0"), an: year, B1: "Envoyer" }; const queryUrl = new URL(this.searchPath, this.baseUrl); queryUrl.search = queryParamsStr; return { formData, queryUrl }; } async readCases(context) { const { formData, queryUrl } = this.queryUrl(context); const page = await this.http.submitForm(queryUrl, formData, { accept: "text/html;charset=iso-8859-1" }); const doc = new JSDOM(page).window.document.documentElement; const rowEls = doc.querySelectorAll("#listgen2 tbody tr"); const rows = Array.from(rowEls); rows.shift(); // Skip header row const cases = []; for (const row of rows) { cases.push(this.getFromRow(context, row)); } return cases; } getBoolean(field) { return field.textContent === "Oui"; } getDate(context, dateField) { const dateFormat = /(\d\d)-(\d\d)-(\d\d\d\d)/; const dateFields = dateFormat.exec(dateField.textContent); const dayOfMonth = dateFields[1]; return new EdtfDate({ year: parseInt(dateFields[3], 10), month: parseInt(dateFields[2], 10), day: dayOfMonth !== "00" ? parseInt(dayOfMonth, 10) : undefined }); } setTime(dateTime, timeField) { const timeFormat = /(\d\d):(\d\d)/; const timeFields = timeFormat.exec(timeField.textContent); const hour = timeFields ? parseInt(timeFields[1], 10) : undefined; const minutes = timeFields ? parseInt(timeFields[2], 10) : undefined; dateTime.hour = hour; dateTime.minute = minutes; dateTime.timeshift = Level2Timeshift.fromString("+01"); // GMT+1/UTC+1 } getFromRow(context, row) { const columns = row.querySelectorAll("td"); const caseLink = columns[0].firstElementChild; const url = new URL(caseLink.href, this.baseUrl); const id = new URLSearchParams(url.search).get("numobs"); const linkParse = BaseOvniFranceHttpDatasource.regExp.exec(caseLink.textContent); assert.ok(linkParse, `Case title "${caseLink.textContent}" does not match pattern ${BaseOvniFranceHttpDatasource.regExp.source}`); const place = linkParse[1]; const depCode = linkParse[2].padStart(2, "0"); const time = this.getDate(context, columns[1]); this.setTime(time, columns[2]); const physicalEffect = this.getBoolean(columns[3]); const witnessEffect = this.getBoolean(columns[4]); const entities = this.getBoolean(columns[5]); const landing = this.getBoolean(columns[6]); return { id, url: url.href, city: place, depCode: depCode, time, physicalEffect, witnessEffect, entities, landing }; } } BaseOvniFranceHttpDatasource.regExp = /(.*?)\s+\(([\dAB]+)\)/;