diff --git a/metar.html b/metar.html index c646dd7..86a7110 100644 --- a/metar.html +++ b/metar.html @@ -246,6 +246,15 @@ 'CU': 'Cumulus', 'CB': 'Cumulonimbus' }; + const specialRemarks = { + 'FROIN': 'Frontal passage in vicinity', + 'CONTRAILS': 'Contrails observed', + 'VIRGA': 'Virga (precipitation not reaching the ground)' + }; + const directions = { + 'N': 'North', 'NE': 'Northeast', 'E': 'East', 'SE': 'Southeast', + 'S': 'South', 'SW': 'Southwest', 'W': 'West', 'NW': 'Northwest' + }; for (let i = 0; i < parts.length; i++) { const part = parts[i]; @@ -255,6 +264,16 @@ decoded.push(` - ${decodeObscurationRemark(part)}`); } else if (part.match(/^([A-Z]{2}\d)+$/)) { decoded.push(` - ${decodeCloudTypesRemark(part)}`); + } else if (part === 'VIRGA' && i + 1 < parts.length && directions[parts[i+1]]) { + const direction = directions[parts[i+1]]; + decoded.push(` - VIRGA ${parts[i+1]}: Virga to the ${direction.toLowerCase()}`); + i++; // Consume direction part + } else if (part === 'TCU' && i + 2 < parts.length && parts[i+1] === 'DSNT' && directions[parts[i+2]]) { + const direction = directions[parts[i+2]]; + decoded.push(` - TCU DSNT ${parts[i+2]}: Towering cumulus distant ${direction.toLowerCase()}`); + i += 2; // Consume DSNT and direction + } else if (specialRemarks[part]) { + decoded.push(` - ${part}: ${specialRemarks[part]}`); } else if (cloudTypes[part] && i + 1 < parts.length && parts[i + 1] === 'TR') { const cloudName = cloudTypes[part]; decoded.push(` - ${part} ${parts[i+1]}: ${cloudName} clouds are translucent (thin)`);