@rr0/cms
Version:
RR0 Content Management System (CMS)
98 lines (97 loc) • 4.11 kB
JavaScript
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]+)\)/;