@faa-aviation-data-portal/aeronav-charts
Version:
Fetch links and metadata for charts provided by Aeronav in a sane format.
85 lines (72 loc) • 2.6 kB
JavaScript
const cheerio = require('cheerio')
exports.parseVfrTable = (html, tableSelector, nthChild) => {
const $ = cheerio.load(html)
let table = $(tableSelector)
if (nthChild !== undefined) {
table = table[nthChild]
}
const data = $(table).find('tr').toArray().map(row => {
const columns = $(row).find('td').toArray()
if (columns.length < 3) {
return null
}
const chartName = columns[0].children[0].data
const currentEdition = columns[1]
const nextEdition = columns[2]
const currentLinks = $(currentEdition).find('a').toArray()
const currentGeoTiffHref = currentLinks[0].children[0].parent.attribs.href
const currentPdfHref = currentLinks[1].children[0].parent.attribs.href
const nextLinks = $(nextEdition).find('a').toArray()
let nextGeoTiffHref = null
let nextPdfHref = null
if (nextLinks.length > 0) {
nextGeoTiffHref = nextLinks[0].children[0].parent.attribs.href
nextPdfHref = nextLinks[1].children[0].parent.attribs.href
}
let currentSequenceNumber
let currentReleaseDate
if (currentEdition.children[0].data.match('–') || currentEdition.children[0].data.match('-')) {
const splitter = currentEdition.children[0].data.match('–')
? ' – '
: ' - '
;[currentSequenceNumber, currentReleaseDate] = currentEdition.children[0].data.split(splitter)
} else {
currentSequenceNumber = null
currentReleaseDate = currentEdition.children[0].data
}
let nextEditionTitle
if (nextEdition.children[0].data) {
nextEditionTitle = nextEdition.children[0].data
} else {
nextEditionTitle = $(nextEdition).find('cfoutput').toArray()[0].children[0].data
}
let nextSequenceNumber
let nextReleaseDate
if (nextEditionTitle.match('-') || nextEditionTitle.match('–')) {
const splitter = currentEdition.children[0].data.match('–')
? ' – '
: ' - '
;[nextSequenceNumber, nextReleaseDate] = nextEditionTitle.split(splitter)
} else {
nextSequenceNumber = null
nextReleaseDate = nextEditionTitle
}
return {
chartName,
currentEdition: {
sequenceNumber: parseInt(currentSequenceNumber) || null,
releaseDate: currentReleaseDate.trim(),
geotiff: currentGeoTiffHref,
pdf: currentPdfHref
},
nextEdition: {
sequenceNumber: parseInt(nextSequenceNumber) || null,
releaseDate: nextReleaseDate.trim(),
geotiff: nextGeoTiffHref,
pdf: nextPdfHref
}
}
})
.filter(x => !!x)
return data
}