TERN Project Log
TERN Copyright 2020-2026 Greg Abbott

2026_0421
adds JAO (JS array of objects) rule: All objects need >1 key
  Parser aims to extract table-like data i.e. 2+ columns 2+ rows
  so now won't mark as JAO: [{age:1},{age:2},{age:3},{age:4}]
adds CSV rule: CSVs need >1 col where col 2 if last has values
adds global table rule: 2+ rows, 2+cols, same qty cols all rows
removes option for gap separated type (k1\nk2\n\nv1\nv1)
  parsing for gap separated blocks matches too many other types
converts input on "CMD+Enter" keyboard shortcut

2026_0420
- Incorporates new text to array of data parser: 
  - handles a string of tables of mixed types and 'other' data
  - handles lack of separation between tables of different kinds
  - text to [other,csv,tsv,html,md,nested_arrays,array_of_pojos]
  - parses each table block to array of arrays then wanted type
  - reassembles to string keeping 'other' data in place
  - eg:
    - IN : [other1,csv_table,other2,html_table]
    - OUT: [other1,converted,other2,converted]
- Removes output options: JS(on)DB, and markdown nested list
- Updates demo text with mixed input of convertible kinds

2026_0203
- Parses 'JS as string' input. Handles named and nameless data:
  named  : "var/let/const name = extracts_this_value"
  unnamed: "[{unquoted:`backticks`/*comment+trailing comma*/,}]"
- Converts user input in two steps to reduce repeated work:
  Converts string to JavaScript array of arrays (jaa) and caches
  Converts cached jaa to any wanted output on demand
  Updates JAA only when user changes input string value

2026_0104
- Adds "Fields then Records" touching text lines form row cells

2025_1014
- Prompts before save for custom file name input

2025_0904
- Extracts table from rich text clipboard to HTML on paste.

2025_0829
- Reverts SSV (space separated value) parser to simpler logic.
  - Parser expects any SSV to never have blank cells.

2025_0723
- Improves CSV to JSON handling of blank first column cells.

2025_0517
- Renames tool to Tern.

2025_0514
- Fixes a bug: Unifies key order across all objects in a list.
    - [{a,b,c},{c,a,b},{b,c,a}] |> [{a,b,c},{a,b,c},{a,b,c}]
    - Needed to produce tables that split keys from values:
      - [[k1,k2],[o1k1v,o1k2v],[o2k1v,o2k2v]]

2025_0222
- Adds align HTML table (presents as grid).
- Adds align JS array of objects as table.
- Adds checkbox to align output when possible if checked.
  - Slims output list (from [Kind A, Kind A Aligned] to Kind A)
- Moves processing options to right side.
- Checks if SSV input is aligned or not and parses accordingly.

2025_0221
- Handles space separated data without aligned columns.
  - See option "Space table (unaligned)".
- Adds minimum gap option to "space table (aligned)" logic.
- Refactors to convert all input to array of arrays first.
  - Previously array of objects first.
- Replaces library (from JAO to X) with new (from JAA to X)
  - JAO: JS array of objects | JAA : JS array of arrays
- Numbers duplicate headers / column names found in input data.
- Suffixes number only column headers, to keep their sort order.
- Handles input where records have or lack different fields.
- Adds "Reverse Headers" to reverse column/keys (A B C > C B A).
- Adds "Reverse Records" (i.e. non-header rows): 1 2 3 -> 3 2 1.
- Removes previous code.

2024_1124
- Refactors 'output to table' functions to share logic.
- Adds 'Rights' popover.

2024_1121
- Escapes tabs and newlines in values for some outputs.
- Refactors various converters.
- Adds button to push output to input.
- Rewrites space separated table parser (handles blank cells).
- Improves text cleaner (removes invisible characters).

2024_1118
- Adds JSON table: written to present CSV like data.

2024_1114
- Refactors converter functions into a JS library.

2024_1029
- Guesses aligned Markdown tables.

2024_1022
- Converts JSON array lists [["k1","k2"],["v1","v2"]].

2024_1018
- Adds more markdown list converters.
- Adds gap separated records converter.
- Restyles front end.
- Converts when user changes input or output type.
- Handles CSV with commas and quotes in values.
- Moves page information into popovers.
- Adds copy and save buttons for input and output.
- Adds function to guess type of input.
- Triggers guess input on paste.
- Selects input type on guess.

2024_0910
- Converts space separated values tables.

2024_0605
- Adds transpose feature to swap X and Y data.

2020_0721
- Merges converters to one page.