Releases: fguitton/vscode-gedcom
Release list
0.8.1
0.8.0
Added
gedcom.virtualIndent.enabledindents each line by its level, as a decoration
that never touches the file ([#2]).gedcom.virtualIndent.widthsets 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
Fixed
- Show Tree did nothing at all when no GEDCOM file was in front of you ([#5]).
The view is contributed behindeditorLangId == gedcom, so there was no view
to focus and.focusresolved 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.
globis pinned throughoverridesto 13. Mocha pulled 10, which npm warns is
unsupported; nothing else in the tree was on it, and no advisory was open.@playwright/browser-chromiumis approved under npm's install-script allowlist,
sonpm installno longer stops to ask about it.
0.7.0
Added
- Notes holding markup can be rendered instead of read as characters, with a
Text / HTML switch.gedcom.details.noteFormatsets the starting choice,
defaulttext; the switch lasts the session. Rendering copies the parsed tree
through an allowlist of formatting tags — the only attribute kept anywhere is
href, onhttp(s)only. fixtures/notes/— HTML in notes, split mid-URL byCONCin 5.5.1 and
declared withMIMEin 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,OBJEandREPOas 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
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 overOCCUanswered 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'sFILE, aWWW, 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.httpandhttpsonly. AFILEpayload is free text from a document the
reader may merely have been sent, andjavascript:,file:andvscode: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.imagePreviewsturns 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, onlyhttpsis permitted.
Fixed
-
A media object written inline was reported as a broken pointer. GEDCOM
5.5.1 letsOBJE, 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@ dfis still
wrong however many substructures follow it. -
A date's time of day was dropped from the details panel.
TIMEhangs under
DATErather 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 1998and threw away09: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/ Personalare
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
GIVNandSURNsubstructures where the file states them and from its own
reading of the string where it does not.Where a person holds several names, the
TYPEbeneath each becomes its label,
so two rows are no longer both called "Name". -
A structure carrying nothing says so.
1 _MAYBEwith 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, notSex: F— for every enumeration
the extension models, not onlySEX. 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 theFORMwhere 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
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_PATis absent and tells you to add the secret and run it again — but
gh release createfails 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
runvp 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-marketplacefamily — 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.mdtoCONTRIBUTING.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 invp run previewwas 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 throughstarry-night,
the open reimplementation of GitHub's highlighter, coloured from the tokens
@primer/primitivespublishes.It found two things the approximation was hiding.
markup.quoteand
entity.name.tagboth resolve topl-ent, so a citation and a name are the
same colour on github.com; andvariable.otherresolves topl-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.tsrather 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
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 theFAMrecords 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 dates —
1901–1975, orb. 1930where 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 asMarried 1874fits 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 unreferencedSUBM
is found too — PAF-era files carry one that the header never points at, and
Linguist's ownRoyal92.gedis 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
CONTlines 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.gedrecords 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 —COMMis 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 M→male,2 QUAY 3→primary), a language tag's language, and how
old the subject was at an event, computed against their ownBIRTdate. 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 said1 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,EMAILand URL-valuedFILEpayloads. - 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; underCHANorCREA, 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 fromHEAD.PLAC.FORM, which almost no
tool surfaces, plus coordinates from aMAPand 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.ADOPand the LDS ordinance statuses. When
a value is outside its set, the alternatives are listed. LANGresolved through BCP 47,FORMthrough 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 —ROMNsays to useTRAN.
- 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 ...