Skip to content

Releases: fguitton/vscode-gedcom

0.8.1

Choose a tag to compare

@github-actions github-actions released this 14 Aug 12:41
v0.8.1
5413794

Changed

  • Code lens titles are computed on demand, per visible lens, instead of for every
    record on every edit.

0.8.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 12:04
v0.8.0
8c46744

Added

  • gedcom.virtualIndent.enabled indents each line by its level, as a decoration
    that never touches the file ([#2]). gedcom.virtualIndent.width sets the
    columns per level.
  • Dates are validated: a month that is not a month, or a day the month cannot
    have. Every calendar, both spellings of the calendar escape.

0.7.1

Choose a tag to compare

@github-actions github-actions released this 14 Aug 11:27
v0.7.1
f3ea0b8

Fixed

  • Show Tree did nothing at all when no GEDCOM file was in front of you ([#5]).
    The view is contributed behind editorLangId == gedcom, so there was no view
    to focus and .focus resolved silently. It now says so, and where the view
    exists but has not come up yet — activation, the context key and the click all
    racing on a cold editor — the container is opened directly rather than the
    result being assumed. An integration test covers the cold path, which every
    other test warms past.

Changed

  • The README lists every setting, with its default and what it does.
  • glob is pinned through overrides to 13. Mocha pulled 10, which npm warns is
    unsupported; nothing else in the tree was on it, and no advisory was open.
  • @playwright/browser-chromium is approved under npm's install-script allowlist,
    so npm install no longer stops to ask about it.

0.7.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 09:40
v0.7.0
aadd913

Added

  • Notes holding markup can be rendered instead of read as characters, with a
    Text / HTML switch. gedcom.details.noteFormat sets the starting choice,
    default text; the switch lasts the session. Rendering copies the parsed tree
    through an allowlist of formatting tags — the only attribute kept anywhere is
    href, on http(s) only.
  • fixtures/notes/ — HTML in notes, split mid-URL by CONC in 5.5.1 and
    declared with MIME in 7.0. Both carry well-formed, unclosed and crossed
    markup, since no rule in either specification inspects any of it.

Fixed

  • The toolbar button did not open the tree panel (#5). The editor title bar
    passes the resource and its own {groupId, editorIndex} context; read as the
    code lens's (uri, line), that revealed the editor at a nonsense position and
    never opened the panel.
  • An inline note was reported as a broken pointer (#2). 5.5.1 defines
    NOTE, SOUR, OBJE and REPO as either a pointer or the content in place,
    and the registry models only the pointer form — so most exporters' notes were
    called malformed.

Changed

  • "Show Graph" is now Show Tree, the panel is Tree, and the code lens says
    see in the tree. Setting keys and command ids are unchanged.
  • Records are counted in English: 3,010 individuals · 1,422 families, not
    3,010 INDI · 1,422 FAM. Used by the lens, the header hover and the details
    panel alike.
  • Dates are said in words, in every calendar GEDCOM defines. ABT 3 NOV 1901
    reads "About 3 November 1901"; a French Republican or Hebrew date keeps its own
    month names and is labelled with its calendar. Gregorian carries no label.
  • The lens above a record leads with the name, then the sex in English and the
    years: Victoria Hanover · Female · 1819–1901 · 2 parents · 1 spouse.
  • Inlay hints read as captions: Died age 73, Male.

Testing

  • The integration tests assert the panel opens and follows the cursor,
    not merely that a command did not throw. They also fail on any unhandled
    rejection in the extension host, and run against Insiders as an advisory CI
    job — where #5 came from, and the one combination nothing covered.

0.6.0

Choose a tag to compare

@github-actions github-actions released this 13 Aug 22:11
v0.6.0
c547f39

Two themes. A GEDCOM file is allowed to indent itself, and files in the wild do —
so those are now read, highlighted and folded like any other, whatever they indent
with. And the panels stop showing the reader the file's own shorthand: slashes
around a surname, F for a sex, a URL that cannot be clicked, a hover that
answers "Text."

Added

  • Indented files are read as first-class. The specification puts the level
    number first on the line with nothing before it, but plenty of exporters
    indent anyway to show the hierarchy, and such a file is now lexed,
    highlighted, folded and validated exactly as a flat one is. detectIndentation
    reports the habit — spaces, tabs or both, the width per level, and any line
    that departs from it.

    A tab's width is the only thing a file cannot state. Where tabs and spaces are
    mixed it is solved by search over the widths anything has ever defaulted to,
    because the direct calculation needs a space-only line at the same level to
    measure against and a file whose first levels are tabs never provides one.

  • Seven fixtures/style/ files carrying the same family tree at one, two and
    four spaces per level, at tabs, and at tabs-then-spaces with the tab standing
    for two, four and eight columns. A test asserts all seven parse to the same
    tree, which is the load-bearing claim: the level number states the hierarchy
    and the whitespace states nothing.

  • A sentence about what each tag is for, in hovers. The registry we vendor is
    a machine's view of the format — tags, payload types, cardinalities, labels —
    and carries no prose, so a hover over OCCU answered with "Text.", which the
    reader could see for themselves.
    Roughly ninety structures now carry a written gloss, and the payload line is
    dropped where the gloss has already said what belongs there. Across the fixture
    corpus this takes the hovers that said nothing from several hundred to none.

  • Links and image previews in the details panel. A URL anywhere in a field —
    a media object's FILE, a WWW, an address written into a note — is now a
    link that opens in the browser, and media the file identifies as a picture is
    shown as a thumbnail beneath its row.

    http and https only. A FILE payload is free text from a document the
    reader may merely have been sent, and javascript:, file: and vscode: URIs
    would otherwise be handed to the machine by a click; the scheme is checked in
    the extension host rather than trusted from the panel.

    Previews are on by default and gedcom.details.imagePreviews turns them off.
    Off rewrites the panel's content security policy rather than merely suppressing
    the <img>, so the panel is then unable to make a request rather than
    disinclined to — the point of the setting is that a photograph hosted by a
    genealogy site does not get to learn that the file is being read, and from
    where. Even on, only https is permitted.

Fixed

  • A media object written inline was reported as a broken pointer. GEDCOM
    5.5.1 lets OBJE, among others, be written either as a pointer or with the
    record's substructures in place of the payload, and the second form is common
    in real files. Only the payload-less form is exempt: 1 ASSO @I1@ df is still
    wrong however many substructures follow it.

  • A date's time of day was dropped from the details panel. TIME hangs under
    DATE rather than beside it, in 5.5.1 and 7.0 alike, and the panel read only
    the date — so a change record, whose entire purpose is to say when, showed
    14 FEB 1998 and threw away 09:22:41. The parse tree was right throughout;
    only the reading of it was wrong.

Changed

  • A name is read rather than copied. The slashes in /Family/ Personal are
    how GEDCOM marks the surname, not punctuation, and the details panel was
    printing them. It now shows the name without them, in the order the file wrote
    — that order is itself information, since the format exists to carry names from
    cultures that write the surname first — and lists the parts beneath, from the
    GIVN and SURN substructures where the file states them and from its own
    reading of the string where it does not.

    Where a person holds several names, the TYPE beneath each becomes its label,
    so two rows are no longer both called "Name".

  • A structure carrying nothing says so. 1 _MAYBE with no payload and nothing
    beneath it used to render as "recorded", a word the file never said. It is now
    marked as having no value, in italic and dimmed, so that a tag someone wrote and
    left blank is visible as exactly that.

  • Coded values are shown in English. The details panel expands an enumerated
    payload to its meaning — Sex: Female, not Sex: F — for every enumeration
    the extension models, not only SEX. Inlay hints capitalise the same labels,
    since a hint is a caption beside the line rather than a clause continuing it.

  • The details panel names a media object by its own title rather than by its tag,
    and says what kind of file it is — read from the FORM where the file writes
    one and from the path's extension where it does not. A residence with an
    address but no place now shows the address instead of the word "recorded".

0.5.2

Choose a tag to compare

@github-actions github-actions released this 13 Aug 19:14
v0.5.2
ba5db07

Tooling and documentation only — nothing in the extension itself changed.

0.5.1 was tagged and never shipped: the manifest was left at 0.5.0, so the
release workflow's version guard refused it, which is precisely what that guard
is for.

Fixed

  • The release workflow could not be re-run. It skips the Marketplace when
    VSCE_PAT is absent and tells you to add the secret and run it again — but
    gh release create fails outright once the release exists, so the advice was
    impossible to follow. An existing release is now updated in place.

  • dist/preview/ no longer ships in the VSIX. It only exists once somebody has
    run vp run preview, so the extension gained 40 kB of developer artifact on
    some machines and not others.

  • The README badges were dead. shields.io has retired its entire
    visual-studio-marketplace family — version, installs, downloads and rating
    all answer "retired badge". They are replaced by a static Marketplace link
    plus release, build and licence, none of which can rot.

    The obvious substitute, vsmarketplacebadges.dev, works and was rejected: the
    Marketplace renders images only from an allowlist of hosts, so those badges
    would have looked right on GitHub and broken on the listing itself. Losing
    version, installs and rating costs nothing there, since the Marketplace page
    already shows all three.

Changed

  • Developer guidance moved from README.md to CONTRIBUTING.md. The README is
    the Marketplace listing, so build instructions and package layout were being
    shown to every prospective user.

Testing

  • GitHub's rendering is now checked against GitHub's rendering. The Primer
    panel in vp run preview was a palette written from memory, which made the
    central claim of the colour design — that the semantic classes stay distinct
    where the palette is narrowest — one nobody could verify. It now runs the
    committed grammar through starry-night,
    the open reimplementation of GitHub's highlighter, coloured from the tokens
    @primer/primitives publishes.

    It found two things the approximation was hiding. markup.quote and
    entity.name.tag both resolve to pl-ent, so a citation and a name are the
    same colour on github.com
    ; and variable.other resolves to pl-smi, whose
    colour is Primer's own foreground, so linkage tags are indistinguishable
    from ordinary text there
    . Six semantic classes come out as four colours in
    light and five in dark, not six. All of it is recorded in
    packages/grammar/test/prettylights.test.ts rather than assumed away.

    It also confirms the new payload-shape rules arrive as pl-ii, the class
    GitHub paints as invalid, rather than as ordinary text.

0.5.0

Choose a tag to compare

@github-actions github-actions released this 13 Aug 17:41
v0.5.0
b4fa8d8

The theme of this release is that a GEDCOM file is mostly opaque identifiers and
undocumented codes, and every feature below removes a reason to leave the line
you are reading.

The graph panel now draws the family, not the file

GEDCOM stores a marriage as a FAM record that both spouses and every child
point at. Drawn literally that put a nameless join record between every pair of
relatives, made a grandparent four hops from a grandchild, and filled the third
column with boxes that answered no question anyone had asked.

  • Families are collapsed. Nodes are people; edges are the relationships
    between them, derived by joining through the FAM records and then discarding
    them. A spouse and a child are now one hop away, not two.

  • Columns are generations, not hop counts. Laid out by hops, a sibling and a
    grandparent shared a column because both are two steps from the focus — two
    generations side by side, saying something false about the family. Ancestors
    now run left of the focus and descendants right, the direction a family tree
    is read in.

  • Couples sit together, joined by a marriage bar, and every child descends
    from one point on it.
    Two parents fanning independently to four children
    makes crossings unavoidable; one line per child from the marriage makes them
    impossible.

  • Sibling groups hang beneath their parents, and siblings run oldest first
    within the group.
    Nothing in the ordering consults the current view, which
    is what stops a column rearranging itself every time the selection moves —
    a reader clicking along a row of relatives was watching the row reshuffle
    under them.

    This replaced a barycentre pass that ordered each column against its
    neighbours. That reads well on any one drawing and produces a different
    drawing every time, because the arrangement is computed from whoever happens
    to be on screen. Ordering by birth alone held still but tangled. Neither trade
    was necessary: hanging each family beneath its parents makes the two columns
    agree by construction rather than by search.

    Measured over 300 neighbourhoods of Linguist's Royal92.ged: 68% are drawn
    with no crossings at all, 87% with two or fewer, and the ninetieth percentile
    is three
    — against 54%, and a ninetieth percentile of fourteen, before any
    of this. Tests hold both the crossing figures and the stability ones.

  • Marriages are shown, labelled with their year, alongside parent and child
    links. Siblings are drawn only where a family records no parents, since
    otherwise they are already two hops apart through one.

  • Boxes carry dates1901–1975, or b. 1930 where only one is known.
    A tree full of people sharing a name is unreadable without them. Where the
    file records none the box shows the name alone: "Individual" under every name
    is a label with no information in it, and a row of them reads as though
    something failed to load.

  • A family is still shown as itself when it is the record under the cursor,
    with its members around it and their roles named. Collapsing is right for
    families travelled through and wrong for the one being looked at.

  • Ancestors / Descendants / Both buttons, because tracing a line back is a
    different task from following it forward, and each is half the graph.

  • Sources, notes and media are left out unless gedcom.graph.includeReferences
    asks for them: a well-sourced person cites dozens, and they crowd out the
    family the panel exists to show.

  • A family is never drawn as a box, not even when it is the record under the
    cursor. It is a join, not a person: no name, no dates, nothing to say that its
    members do not say better. Putting the cursor in one shows that family — the
    couple and their children — and highlights all of them.

  • Edges run left to right whichever way the pointer is written, and labels are
    placed with a backing plate, nudged apart where two would collide. The gutter
    between columns was widened so a label such as Married 1874 fits in it, and
    labels are drawn after the boxes: painted before them, a marriage year
    ended up half hidden behind the spouse below it.

  • Relationships that cross no generation — siblings, citations, and a couple —
    are routed down the side of their column. Drawn as a left-to-right curve such
    an edge doubled back on itself and dropped its label behind a box.

The details panel

A second view in the same GEDCOM panel, for everything the graph has to
discard in order to stay readable.

  • Selecting a person shows what they actually contain: occupation,
    residence, the place they were born, notes, citations, identifiers — composed
    generically from the registry, so a tag nobody anticipated appears rather than
    being dropped silently. Every field jumps to its line when clicked.
  • With nothing selected it describes the file: the program that wrote it,
    the character set, the counts, and the submitter with their address and notes.
    None of that is a person or a family, and drawn into the graph the submitter
    became a box with no generation and no relationships. An unreferenced SUBM
    is found too — PAF-era files carry one that the header never points at, and
    Linguist's own Royal92.ged is one of them.
  • Clicking a box in the graph now selects rather than navigates. Reading down
    a line of descent means looking at a dozen people in turn, and jumping the
    editor to each one loses the reader's place in the file for no benefit.
    Navigation is its own gesture, on a button that appears on the box.
  • Text written across CONT lines is shown whole — monospace, wrapped, in a
    block of its own — whether the record is reached as the file's submitter or
    selected in its own right. Royal92.ged records the file's provenance as a
    twenty-eight line posting from 1992, and only its first line was reaching the
    panel; its three-line address fared no better. The parser's reassembly was
    never at fault, and a test now proves it: this layer was discarding the rest.
  • A short list of vendor tags the registry has never covered are named in
    English — COMM is PAF's comment field, and it is what carries that
    provenance note. The list stays short deliberately: a confidently wrong label
    is worse than a bare tag.
  • A record that is neither a person nor a family no longer appears in the graph
    as a lone box with no generation and no relationships. The panel says where to
    find its contents instead.
  • The graph scrolls the selection into view when the neighbourhood is larger
    than the panel, on whichever axis actually overflows.
  • Children descend from the parent whose line is being traced rather than from
    the midpoint between the couple. The midpoint is nobody — it floats in the gap
    between two boxes, and a reader following a descent cannot tell which of the
    two it belongs to.

Added

  • Inlay hints, off the back of that: what each pointer names
    (1 FAMS @F1@John Smith + Jane Doe), what each coded value means
    (1 SEX Mmale, 2 QUAY 3primary), a language tag's language, and how
    old the subject was at an event, computed against their own BIRT date. Each
    kind has its own setting, because the resolved names are indispensable in an
    unfamiliar file and noise in your own. An age carries the verb of its event —
    died age 73, married age 24 — and every hint is set apart from the payload
    so it does not read as though the file itself said 1 SEX M male.
  • Code lens above each record: its shape in the tree, a clickable reference
    count that peeks every pointer to it, and a link into the graph panel. Above
    HEAD, the dataset summary the header does not carry — record counts and the
    span of years the file covers.
  • Document links on WWW, EMAIL and URL-valued FILE payloads.
  • Per-verb hovers. The rule they are written against is that a hover must
    answer the question the line provokes rather than restate the tag:
    • DATE — the weekday for an exact date, what a qualified date is claiming,
      and how old the subject was; under CHAN or CREA, how long ago instead,
      because whether a record is maintained is the actual question there.
    • AGE — the notation in words, cross-checked against the recorded dates.
      An age that disagrees with the file's own birth and event dates is flagged.
      Nothing else in the format checks the two against each other.
    • PLAC — the jurisdictions labelled from HEAD.PLAC.FORM, which almost no
      tool surfaces, plus coordinates from a MAP and a link to a map service.
    • NAME — split into given name, surname and suffix on the slashes, with a
      note when no surname is marked.
    • NCHI — how many children are claimed against how many are recorded, which
      is the research question rather than a restatement.
    • Enumerated payloads across QUAY, PEDI, RESN, SEX, FAMC.STAT,
      NAME.TYPE, MEDI, ROLE, FAMC.ADOP and the LDS ordinance statuses. When
      a value is outside its set, the alternatives are listed.
    • LANG resolved through BCP 47, FORM through media types in both the modern
      and 5.5.1 spellings, and the identifier families (REFN, UID, EXID,
      RIN, AFN, RFN) distinguished from each other.
    • A migration note on any tag the file's version removed, carrying the
      replacement — ROMN says to use TRAN.
  • Cardinality stated in words: "Required, exactly one" rather than {1:1}.
  • The detected version, in the status bar. It governs how every line in the
    file is read and is frequently guessed rather than declared, so a reader who
    disagrees with the guess needs to see it before anything else makes sense. An
    inferred version is flagged with the warning background; the tooltip explains
    how it was arrived at and what the file contains.
  • Payload shapes checked in the grammar, so a wrong value is coloured as
    wrong while it is being typed rather ...
Read more