npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@pilchd/fle

v1.0.0-rc.1

Published

PEG parser for a superset of DF3CB's Fast Log Entry 3

Downloads

7

Readme

fle

PEG parser for a superset of DF3CB's Fast Log Entry 3

Many established out-of-the-box solutions for manipulating FLE files exist; if you're only looking to process a log to ADIF (perhaps for upload to Logbook of the World or similar), take them each for a spin and select your favorite.

| Tool | Platform | Frontend | Implemented in | Source | | :----------------- | :-------------------- | :------ | :------------------- | :------------------- | | Fast Log Entry | Windows | GUI | ? | Closed | | FLEcli | Windows, macOS, Linux | CLI | Go | Open (MIT) | | sfle | Web | Web | JavaScript | Open (AGPL-3.0) | | fle-cli | Windows, macOS, Linux | CLI | TypeScript (Node.js) | Open (MIT) |

This table is maintained in good faith--if I've misrepresented your application or excluded it entirely, please reach out!

If you still need an extensible parser for your own implementation, read on!

Overview

Fast Log Entry is DF3CB's implementation of his specification; the community's programs largely operate within it and bring functionality to additional platforms.

While the original program and its community derivations are excellent, I wanted to add a few custom features (likely outside the scope of existing implementations) on top of an extensible, grammar-based, cross-platform codebase. I do this namely (for fun!) as a component of my own FLE implementation, fle-cli, but the module aims to be generally useful as a starting point for others looking to implement, extend, or integrate FLE.

Pre-1.0.0 Tasks

  • [ ] Support any separators in DATE
  • [ ] Support abbreviated DATE
  • [ ] Support time interpolation
  • [ ] Support MY_SOTA_REF
  • [ ] Support MY_WWFF_REF
  • [ ] Support contest logging
  • [ ] Support consecutive serial numbers
  • [ ] Annotate grammar rules
  • [ ] Test cases :)

Installation

npm install @pilchd/fle

Usage

// This example is available at `example/usage.js'.
import {adiObject, parse, SyntaxError} from "./dist/index";

// The parser accepts FLE as a string.
const fle1 = "mycall W1AW\n2023-12-01 20m SSB 1234 W1AW/1\nW1AW/2\n";
const fle2 = ["mycall W1AW", "2023-12-01 20m SSB 1234 W1AW", "W1AW/2"].join('\n');

try {
    // It returns the ADIF header and record fields as objects, one per header (1) and QSO (1+).
    // Object keys are ADIF 3.1.4 field names; object values are valid data for those fields.
    parse(fle1, "fle1").adif.header.ADIF_VER === "3.1.4"
    parse(fle2, "fle2").adif.qso[0].TIME_ON === "1234"
    parse(fle2, "fle2").adif.qso[1].CALL === "W1AW/2"
}
catch (e) {
    // It detects one syntax error at a time and throws it with a friendly error message.
    if (e instanceof SyntaxError) {
        console.log(e.message);
        process.exit();
    }
    else {
        throw e;
    }
}

// A simple utility function is included to format these objects in ADI.
console.log(adiObject(parse(fle2, "fle2").adif.qso[0], "record"));
// The ordering is dependent on the parse, but contains no more than the following:
// <STATION_CALLSIGN:4>W1AW <QSO_DATE:8>20231201 <BAND:3>20m <MODE:3>SSB
// <TIME_ON:4>1234 <CALL:6>W1AW/1 <RST_SENT:2>59 <RST_RECEIVED:2>59 <EOR>

// Accordingly, a complete FLE implementation to process `fle2` is as simple as follows.
console.log(adiObject(parse(fle2, "fle2").adif.header, "header"));
parse(fle2, "fle2").adif.qso.forEach(qso => console.log(adiObject(qso, "record")));

API

TODO

Extensions to Fast Log Entry

  • QSO data may be entered in any sequence (CALL need not immediately follow TIME_ON), except the following:

    • If entered, the time (TIME_ON) must precede the callsign (CALL)
    • If entered, any RST values (RST_SENT, RST_RECEIVED) must follow the callsign (CALL)

    | Valid in Fast Log Entry and fle | Valid only in fle | | --------------------------------- | -------------------------------- | | 2023-12-01 20m SSB 1234 W1AW/1 | 2023-12-01 1234 20m SSB W1AW/1 |

    This requirement (or one meeting a similar condition) is inherent to FLE: a time or its abbreviation (59) and a RST report (59) are indistinguishable.

  • The DAY keyword may be followed by any quantity (including zero) of whitespace.

    | Valid in Fast Log Entry and fle | Valid only in fle | | --------------------------------- | ------------------- | | day +++ | day+++ |

Contributing

fle functions in more cases than Fast Log Entry, so the application does not aim for 100% compatibility. It strives to meet the following standard:

  • Any valid Fast Log Entry log is a valid fle log.
  • Any invalid Fast Log Entry log, excluding the cases enumerated in Extensions, is an invalid fle log.

If you find an exception, please open an issue!

Glossary: Supported ADI Fields

ADIF_VER
APP_FLE_NICKNAME
BAND
CALL
FREQ
GRIDSQUARE
MODE
MY_GRIDSQUARE
MY_POTA_REF
NAME
OPERATOR
POTA_REF
PROGRAMID
QSLMSG
QSO_DATE
RST_SENT
RST_RECEIVED
STATION_CALLSIGN
TIME_ON