This is an automated email from the ASF dual-hosted git repository.

emkornfield pushed a commit to branch production
in repository https://gitbox.apache.org/repos/asf/parquet-site.git


The following commit(s) were added to refs/heads/production by this push:
     new 440fe9c  Record implementation status as structured data. (#143)
440fe9c is described below

commit 440fe9c6fcd7c61128d4166434a4486439d58b28
Author: emkornfield <[email protected]>
AuthorDate: Sat Dec 13 21:26:38 2025 -0800

    Record implementation status as structured data. (#143)
    
    Converts status page to render data stored in YAML files.
---
 .../en/docs/File Format/implementationstatus.md    | 151 +--------------------
 data/implementations/categories.yaml               |  30 ++++
 data/implementations/engines.yaml                  |  55 ++++++++
 data/implementations/features/api-features.yaml    |  21 +++
 data/implementations/features/compressions.yaml    |  25 ++++
 data/implementations/features/encodings.yaml       |  28 ++++
 data/implementations/features/format-features.yaml |  31 +++++
 data/implementations/features/logical-types.yaml   |  70 ++++++++++
 data/implementations/features/physical-types.yaml  |  26 ++++
 data/implementations/legend.yaml                   |  25 ++++
 data/implementations/support/arrow-go.yaml         | 128 +++++++++++++++++
 data/implementations/support/arrow-rs.yaml         | 130 ++++++++++++++++++
 data/implementations/support/arrow.yaml            | 125 +++++++++++++++++
 data/implementations/support/cudf.yaml             | 125 +++++++++++++++++
 data/implementations/support/duckdb.yaml           | 126 +++++++++++++++++
 data/implementations/support/hyparquet.yaml        | 125 +++++++++++++++++
 data/implementations/support/parquet-java.yaml     | 129 ++++++++++++++++++
 layouts/shortcodes/implementation-status.html      | 135 ++++++++++++++++++
 18 files changed, 1340 insertions(+), 145 deletions(-)

diff --git a/content/en/docs/File Format/implementationstatus.md 
b/content/en/docs/File Format/implementationstatus.md
index 110679e..7141d9a 100644
--- a/content/en/docs/File Format/implementationstatus.md       
+++ b/content/en/docs/File Format/implementationstatus.md       
@@ -12,12 +12,13 @@ of this page by opening an issue or submitting a pull 
request.
 
 ### Legend
 The value in each box means:
-* ✅: supported
+* ✅: supported. Footnote added when support is partial.
 * ❌: not supported
-* (R/W): partial reader/writer only support
+* (R): only read support
+* (W): only write support
 * (blank): no data
 
-Implementations:
+### Implementations
 * [arrow](https://github.com/apache/arrow/tree/main/cpp/src/parquet) (C++)
 * [parquet-java](https://github.com/apache/parquet-java) (Java)
 * [arrow-go](https://github.com/apache/arrow-go/tree/main/parquet) (Go)
@@ -26,145 +27,5 @@ Implementations:
 * [hyparquet](https://github.com/hyparam/hyparquet) (JavaScript)
 * [duckdb](https://github.com/duckdb/duckdb) (C++)
 
-### Physical types
-
-Physical types are defined by the [`enum Type` in parquet.thrift]
-
-[`enum Type` in parquet.thrift]: 
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L32
-
-
-| Data type                                 | arrow | parquet-java  | arrow-go 
| arrow-rs | cudf  | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | -------- 
| -------- | ----- | --------- | ------ |
-| BOOLEAN                                   |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-| INT32                                     |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-| INT64                                     |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-| INT96 (1)                                 |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |  (R)  |
-| FLOAT                                     |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-| DOUBLE                                    |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-| BYTE_ARRAY                                |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-| FIXED_LEN_BYTE_ARRAY                      |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  ✅   |
-
-* \(1) This type is deprecated, but as of 2024 it's common in currently 
produced parquet files
-
-
-### Logical types
-
-Logical types are defined by the [`union LogicalType` in parquet.thrift] and 
described in [LogicalTypes.md]
-
-[`union LogicalType` in parquet.thrift]: 
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L471
-[LogicalTypes.md]: 
https://github.com/apache/parquet-format/blob/master/LogicalTypes.md
-
-| Data type                               | arrow | parquet-java | arrow-go | 
arrow-rs | cudf | hyparquet | duckdb |
-|-----------------------------------------|------| ------------- | ------- | 
--------- | ---- | -------- |--------|
-| STRING                                  | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| ENUM                                    | ❌    |  ✅          |  ✅     |  ✅ 
(1)   |  ❌  |  ✅      | ✅      |
-| UUID                                    | ❌    |  ✅          |  ✅     |  ✅ 
(1)   |  ❌  |  ✅      | ✅      |
-| 8, 16, 32, 64 bit signed and unsigned INT | ✅  |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| DECIMAL (INT32)                         | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| DECIMAL (INT64)                         | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| DECIMAL (BYTE_ARRAY)                    | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | (R)    |
-| DECIMAL (FIXED_LEN_BYTE_ARRAY)          | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| FLOAT16                                 | ✅    |  ✅ (1)      |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| DATE                                    | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| TIME (INT32)                            | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| TIME (INT64)                            | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| TIMESTAMP (INT64)                       | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-| INTERVAL                                | ✅    |  ✅ (1)      |  ✅     |  ✅   
    |  ❌  |  ✅      | ✅      |
-| JSON                                    | ✅    |  ✅ (1)      |  ✅     |  ✅ 
(1)   |  ❌  |  ✅      | ✅      |
-| BSON                                    | ❌    |  ✅ (1)      |  ✅     |  ✅ 
(1)   |  ❌  |  ❌      | ❌      |
-| [VARIANT]                               |       |  ✅          |  ✅     |  ✅  
     |  ❌  |  ❌      | ✅      |
-| [GEOMETRY]                              | ✅    |  ✅          |  ❌     |  ✅   
    |  ❌  |  ✅      | ✅      |
-| [GEOGRAPHY]                             | ✅    |  ✅          |  ❌     |  ✅   
    |  ❌  |  ✅      | ✅      |
-| LIST                                    | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  (R)     | ✅      |
-| MAP                                     | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  (R)     | ✅      |
-| UNKNOWN (always null)                   | ✅    |  ✅          |  ✅     |  ✅   
    |  ✅  |  ✅      | ✅      |
-
-* \(1) Only supported to use its annotated physical type
-
-[VARIANT]: 
https://github.com/apache/parquet-format/blob/master/VariantEncoding.md
-[GEOMETRY]: 
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
-[GEOGRAPHY]: 
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
-
-
-### Encodings
-
-Encodings are defined by the [`enum Encoding` in parquet.thrift] and described 
in [Encodings.md]
-
-[`enum Encoding` in parquet.thrift]: 
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L566
-[Encodings.md]: 
https://github.com/apache/parquet-format/blob/master/Encodings.md
-
-| Encoding                                  | arrow | parquet-java  | arrow-go 
| arrow-rs | cudf  | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | -------- 
| -------- | ----- | --------- | ------ |
-| PLAIN                                     |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |   ✅   |
-| PLAIN_DICTIONARY                          |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |  (R)   |
-| RLE_DICTIONARY                            |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |   ✅   |
-| RLE                                       |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |   ✅   |
-| BIT_PACKED (deprecated)                   |  ✅   |  ✅           |  ✅      |  
❌ (1)  |  (R)  |  (R)      |   ❌   |
-| DELTA_BINARY_PACKED                       |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |   ✅   |
-| DELTA_LENGTH_BYTE_ARRAY                   |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |   ✅   |
-| DELTA_BYTE_ARRAY                          |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |   ✅   |
-| BYTE_STREAM_SPLIT                         |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |   ✅   |
-
-* \(1) Partial read support, but only in the case of level data with a 
bitwidth of 0
-
-### Compressions
-
-Compressions are defined by the [`enum CompressionCodec` in parquet.thrift] 
and described in [Compression.md]
-
-[`enum CompressionCodec` in parquet.thrift]: 
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L642
-[Compression.md]: 
https://github.com/apache/parquet-format/blob/master/Compression.md
-
-| Compression                               | arrow | parquet-java  | arrow-go 
| arrow-rs | cudf  | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | -------- 
| -------- | ----- | --------- | ------ |
-| UNCOMPRESSED                              |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |   ✅   |
-| BROTLI                                    |  ✅   |  ✅           |  ✅      |  
✅      |  (R)  |  (R)      |   ✅   |
-| GZIP                                      |  ✅   |  ✅           |  ✅      |  
✅      |  (R)  |  (R)      |   ✅   |
-| LZ4 (deprecated)                          |  ✅   |  ❌           |  ❌      |  
✅      |  ❌   |  (R)      |   ❌   |
-| LZ4_RAW                                   |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |   ✅   |
-| LZO                                       |  ❌   |  ❌           |  ❌      |  
❌      |  ❌   |  ❌       |   ❌   |
-| SNAPPY                                    |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |   ✅   |
-| ZSTD                                      |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  (R)      |   ✅   |
-
-### Other format level features
-
-| Feature                         | arrow | parquet-java  | arrow-go | 
arrow-rs | cudf | hyparquet | duckdb |
-|---------------------------------| ----- | ------------- | -------- | 
-------- | ---- | --------- | ------ |
-| [xxHash-based bloom filters]    |  (R)  |  ✅           |  ✅      |  ✅      | 
 (R) |           |  ✅    |
-| Bloom filter length (1)         |  (R)  |  ✅           |  ✅      |  ✅      | 
 (R) |           |  ✅    |
-| Statistics min_value, max_value |  ✅   |  ✅           |  ✅      |  ✅      |  
✅  |  ✅       |  ✅    |
-| [Page index]                    |  ✅   |  ✅           |  ✅      |  ✅      |  
✅  |  (R)      |  (R)   |
-| Page CRC32 checksum             |  ✅   |  ✅           |  ❌      |  ✅      |  
❌  |  ❌       |  (R)   |
-| [Modular encryption]            |  ✅   |  ✅           |  ✅      |  ✅      |  
❌  |  ❌       |  ✅ (*) |
-| Size statistics (2)             |  ✅   |  ✅           |  (R)     |  ✅      | 
 ✅  |           |  (R)   |
-| Data Page V2 (3)                |  ✅   |  ✅           |  ✅      |  ✅      |  
✅  |  ✅       |  ✅    |
-
-* \(1) In [parquet.thrift]: ColumnMetaData->bloom_filter_length
-
-* \(2) In [parquet.thrift]: ColumnMetaData->size_statistics
-
-* \(3) In [parquet.thrift]: DataPageHeaderV2
-
-[xxHash-based bloom filters]: 
https://github.com/apache/parquet-format/blob/master/BloomFilter.md
-[parquet.thrift]: 
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift
-[Page index]: https://github.com/apache/parquet-format/blob/master/PageIndex.md
-[Modular encryption]: 
https://github.com/apache/parquet-format/blob/master/Encryption.md
-
-
-* (*) Partial support
-
-### High level data APIs for Parquet feature usage
-
-| Feature                                   | arrow | parquet-java  | arrow-go 
| arrow-rs | cudf  | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | -------- 
| -------- | ----- | --------- | ------ |
-| External column data (1)                  |  ✅   |  ✅           |  ❌      |  
❌      |  (W)  |  ✅       |   ❌   |
-| Row group "Sorting column" metadata (2)   |  ✅   |  ❌           |  ✅      |  
✅      |  (W)  |  ❌       |   (R)  |
-| Row group pruning using statistics        |  ❌   |  ✅           |  ✅ (*)  |  
✅      |  ✅   |  ❌       |   ✅   |
-| Row group pruning using bloom filter      |  ❌   |  ✅           |  ✅ (*)  |  
✅      |  ✅   |  ❌       |   ✅   |
-| Reading select columns only               |  ✅   |  ✅           |  ✅      |  
✅      |  ✅   |  ✅       |   ✅   |
-| Page pruning using statistics             |  ❌   |  ✅           |  ✅ (*)  |  
✅      |  ❌   |  ❌       |   ❌   |
-
-* \(1) In parquet.thrift: ColumnChunk->file_path
-
-* \(2) In parquet.thrift: RowGroup->sorting_columns
-
-* (*) Partial Support
+<!-- Status source in data/implementations -->
+{{< implementation-status >}}
diff --git a/data/implementations/categories.yaml 
b/data/implementations/categories.yaml
new file mode 100644
index 0000000..93d9f95
--- /dev/null
+++ b/data/implementations/categories.yaml
@@ -0,0 +1,30 @@
+- id: physical-types
+  name: Physical types
+  description: "Physical types are defined by the [`enum Type` in 
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L32)"
+  spec_doc_url: null
+  header: "Data Type"
+
+- id: logical-types
+  header: Data Type
+  name: Logical types
+  description: "Logical types are defined by the [`union LogicalType` in 
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L471)
 and described in 
[LogicalTypes.md](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md)"
+
+- id: encodings
+  header: Encoding
+  name: Encodings
+  description: "Encodings are defined by the [`enum Encoding` in 
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L566)
 and described in 
[Encodings.md](https://github.com/apache/parquet-format/blob/master/Encodings.md)"
+
+- id: compressions
+  header: Compression
+  name: Compression Codecs
+  description: "Compressions are defined by the [`enum CompressionCodec` in 
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L642)
 and described in 
[Compression.md](https://github.com/apache/parquet-format/blob/master/Compression.md)"
+
+- id: format-features
+  header: Feature
+  name: Other format level features
+  description: null
+
+- id: api-features
+  header: Feature
+  name: High level data APIs for Parquet feature usage
+  description: null
diff --git a/data/implementations/engines.yaml 
b/data/implementations/engines.yaml
new file mode 100644
index 0000000..4d6fa6e
--- /dev/null
+++ b/data/implementations/engines.yaml
@@ -0,0 +1,55 @@
+- id: arrow
+  name: arrow
+  display_name: Apache Arrow C++
+  language: C++
+  repo_url: https://github.com/apache/arrow/tree/main/cpp/src/parquet
+  docs_url: https://arrow.apache.org/docs/cpp/parquet.html
+  versions: {}
+
+- id: parquet-java
+  name: parquet-java
+  display_name: Parquet Java
+  language: Java
+  repo_url: https://github.com/apache/parquet-java
+  docs_url: null
+  versions: {}
+
+- id: arrow-go
+  name: arrow-go
+  display_name: Apache Arrow Go
+  language: Go
+  repo_url: https://github.com/apache/arrow-go/tree/main/parquet
+  docs_url: null
+  versions: {}
+
+- id: arrow-rs
+  name: arrow-rs
+  display_name: Apache Arrow Rust
+  language: Rust
+  repo_url: https://github.com/apache/arrow-rs/blob/main/parquet/README.md
+  docs_url: null
+  versions: {}
+
+- id: cudf
+  name: cudf
+  display_name: cuDF
+  language: C++
+  repo_url: https://github.com/rapidsai/cudf
+  docs_url: null
+  versions: {}
+
+- id: hyparquet
+  name: hyparquet
+  display_name: Hyparquet
+  language: JavaScript
+  repo_url: https://github.com/hyparam/hyparquet
+  docs_url: null
+  versions: {}
+
+- id: duckdb
+  name: duckdb
+  display_name: DuckDB
+  language: C++
+  repo_url: https://github.com/duckdb/duckdb
+  docs_url: null
+  versions: {}
diff --git a/data/implementations/features/api-features.yaml 
b/data/implementations/features/api-features.yaml
new file mode 100644
index 0000000..2388354
--- /dev/null
+++ b/data/implementations/features/api-features.yaml
@@ -0,0 +1,21 @@
+category_id: api-features
+features:
+  - id: api-external-column-data
+    display_name: External column data
+    note: "In parquet.thrift: ColumnChunk->file_path"
+
+  - id: api-sorting-columns
+    display_name: Row group "Sorting column" metadata
+    note: "In parquet.thrift: RowGroup->sorting_columns"
+
+  - id: api-rowgroup-pruning-stats
+    display_name: Row group pruning using statistics
+
+  - id: api-rowgroup-pruning-bloom
+    display_name: Row group pruning using bloom filter
+
+  - id: api-column-projection
+    display_name: Reading select columns only
+
+  - id: api-page-pruning-stats
+    display_name: Page pruning using statistics
diff --git a/data/implementations/features/compressions.yaml 
b/data/implementations/features/compressions.yaml
new file mode 100644
index 0000000..fec73a0
--- /dev/null
+++ b/data/implementations/features/compressions.yaml
@@ -0,0 +1,25 @@
+category_id: compressions
+features:
+  - id: compression-uncompressed
+    display_name: UNCOMPRESSED
+
+  - id: compression-brotli
+    display_name: BROTLI
+
+  - id: compression-gzip
+    display_name: GZIP
+
+  - id: compression-lz4-deprecated
+    display_name: LZ4 (deprecated)
+
+  - id: compression-lz4-raw
+    display_name: LZ4_RAW
+
+  - id: compression-lzo
+    display_name: LZO
+
+  - id: compression-snappy
+    display_name: SNAPPY
+
+  - id: compression-zstd
+    display_name: ZSTD
diff --git a/data/implementations/features/encodings.yaml 
b/data/implementations/features/encodings.yaml
new file mode 100644
index 0000000..485b19b
--- /dev/null
+++ b/data/implementations/features/encodings.yaml
@@ -0,0 +1,28 @@
+category_id: encodings
+features:
+  - id: encoding-plain
+    display_name: PLAIN
+
+  - id: encoding-plain-dictionary
+    display_name: PLAIN_DICTIONARY
+
+  - id: encoding-rle-dictionary
+    display_name: RLE_DICTIONARY
+
+  - id: encoding-rle
+    display_name: RLE
+
+  - id: encoding-bit-packed
+    display_name: BIT_PACKED (deprecated)
+
+  - id: encoding-delta-binary-packed
+    display_name: DELTA_BINARY_PACKED
+
+  - id: encoding-delta-length-byte-array
+    display_name: DELTA_LENGTH_BYTE_ARRAY
+
+  - id: encoding-delta-byte-array
+    display_name: DELTA_BYTE_ARRAY
+
+  - id: encoding-byte-stream-split
+    display_name: BYTE_STREAM_SPLIT
diff --git a/data/implementations/features/format-features.yaml 
b/data/implementations/features/format-features.yaml
new file mode 100644
index 0000000..703a5d9
--- /dev/null
+++ b/data/implementations/features/format-features.yaml
@@ -0,0 +1,31 @@
+category_id: format-features
+features:
+  - id: format-bloom-filters
+    display_name: xxHash-based bloom filters
+    spec_url: 
https://github.com/apache/parquet-format/blob/master/BloomFilter.md
+
+  - id: format-bloom-filter-length
+    display_name: Bloom filter length
+    note: "In parquet.thrift: ColumnMetaData->bloom_filter_length"
+
+  - id: format-stats-min-max
+    display_name: Statistics min_value, max_value
+
+  - id: format-page-index
+    display_name: Page index
+    spec_url: https://github.com/apache/parquet-format/blob/master/PageIndex.md
+
+  - id: format-page-crc32
+    display_name: Page CRC32 checksum
+
+  - id: format-modular-encryption
+    display_name: Modular encryption
+    spec_url: 
https://github.com/apache/parquet-format/blob/master/Encryption.md
+
+  - id: format-size-statistics
+    display_name: Size statistics
+    note: "In parquet.thrift: ColumnMetaData->size_statistics"
+
+  - id: format-data-page-v2
+    display_name: Data Page V2
+    note: "In parquet.thrift: DataPageHeaderV2"
diff --git a/data/implementations/features/logical-types.yaml 
b/data/implementations/features/logical-types.yaml
new file mode 100644
index 0000000..e6460b0
--- /dev/null
+++ b/data/implementations/features/logical-types.yaml
@@ -0,0 +1,70 @@
+category_id: logical-types
+features:
+  - id: logical-string
+    display_name: STRING
+
+  - id: logical-enum
+    display_name: ENUM
+
+  - id: logical-uuid
+    display_name: UUID
+
+  - id: logical-int-types
+    display_name: 8, 16, 32, 64 bit signed and unsigned INT
+
+  - id: logical-decimal-int32
+    display_name: DECIMAL (INT32)
+
+  - id: logical-decimal-int64
+    display_name: DECIMAL (INT64)
+
+  - id: logical-decimal-byte-array
+    display_name: DECIMAL (BYTE_ARRAY)
+
+  - id: logical-decimal-fixed-len-byte-array
+    display_name: DECIMAL (FIXED_LEN_BYTE_ARRAY)
+
+  - id: logical-float16
+    display_name: FLOAT16
+
+  - id: logical-date
+    display_name: DATE
+
+  - id: logical-time-int32
+    display_name: TIME (INT32)
+
+  - id: logical-time-int64
+    display_name: TIME (INT64)
+
+  - id: logical-timestamp-int64
+    display_name: TIMESTAMP (INT64)
+
+  - id: logical-interval
+    display_name: INTERVAL
+
+  - id: logical-json
+    display_name: JSON
+
+  - id: logical-bson
+    display_name: BSON
+
+  - id: logical-variant
+    display_name: VARIANT
+    spec_url: 
https://github.com/apache/parquet-format/blob/master/VariantEncoding.md
+
+  - id: logical-geometry
+    display_name: GEOMETRY
+    spec_url: 
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+
+  - id: logical-geography
+    display_name: GEOGRAPHY
+    spec_url: 
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+
+  - id: logical-list
+    display_name: LIST
+
+  - id: logical-map
+    display_name: MAP
+
+  - id: logical-unknown
+    display_name: UNKNOWN (always null)
diff --git a/data/implementations/features/physical-types.yaml 
b/data/implementations/features/physical-types.yaml
new file mode 100644
index 0000000..38d1871
--- /dev/null
+++ b/data/implementations/features/physical-types.yaml
@@ -0,0 +1,26 @@
+category_id: physical-types
+features:
+  - id: physical-boolean
+    display_name: BOOLEAN
+
+  - id: physical-int32
+    display_name: INT32
+
+  - id: physical-int64
+    display_name: INT64
+
+  - id: physical-int96
+    display_name: INT96
+    note: "This type is deprecated, but as of 2024 it's common in currently 
produced parquet files"
+
+  - id: physical-float
+    display_name: FLOAT
+
+  - id: physical-double
+    display_name: DOUBLE
+
+  - id: physical-byte-array
+    display_name: BYTE_ARRAY
+
+  - id: physical-fixed-len-byte-array
+    display_name: FIXED_LEN_BYTE_ARRAY
diff --git a/data/implementations/legend.yaml b/data/implementations/legend.yaml
new file mode 100644
index 0000000..51400ee
--- /dev/null
+++ b/data/implementations/legend.yaml
@@ -0,0 +1,25 @@
+symbols:
+  full:
+    display: "✅"
+    description: supported
+    class: status-full
+
+  read:
+    display: "(R)"
+    description: partial reader only support
+    class: status-read
+
+  write:
+    display: "(W)"
+    description: partial writer only support
+    class: status-write
+
+  none:
+    display: "❌"
+    description: not supported
+    class: status-none
+
+  unknown:
+    display: ""
+    description: no data
+    class: status-unknown
diff --git a/data/implementations/support/arrow-go.yaml 
b/data/implementations/support/arrow-go.yaml
new file mode 100644
index 0000000..d957660
--- /dev/null
+++ b/data/implementations/support/arrow-go.yaml
@@ -0,0 +1,128 @@
+engine_id: arrow-go
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: full
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: full
+  logical-uuid:
+    status: full
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: full
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: full
+  logical-json:
+    status: full
+  logical-bson:
+    status: full
+  logical-variant:
+    status: full
+  logical-geometry:
+    status: none
+  logical-geography:
+    status: none
+  logical-list:
+    status: full
+  logical-map:
+    status: full
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: full
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: full
+  encoding-delta-binary-packed:
+    status: full
+  encoding-delta-length-byte-array:
+    status: full
+  encoding-delta-byte-array:
+    status: full
+  encoding-byte-stream-split:
+    status: full
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: full
+  compression-gzip:
+    status: full
+  compression-lz4-deprecated:
+    status: none
+  compression-lz4-raw:
+    status: full
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: full
+  format-bloom-filters:
+    status: full
+  format-bloom-filter-length:
+    status: full
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: full
+  format-page-crc32:
+    status: none
+  format-modular-encryption:
+    status: full
+  format-size-statistics:
+    status: read
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: none
+  api-sorting-columns:
+    status: full
+  api-rowgroup-pruning-stats:
+    status: full
+    note: Partial support
+  api-rowgroup-pruning-bloom:
+    status: full
+    note: Partial support
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: full
+    note: Partial support
diff --git a/data/implementations/support/arrow-rs.yaml 
b/data/implementations/support/arrow-rs.yaml
new file mode 100644
index 0000000..5873ecc
--- /dev/null
+++ b/data/implementations/support/arrow-rs.yaml
@@ -0,0 +1,130 @@
+engine_id: arrow-rs
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: full
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-uuid:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: full
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: full
+  logical-json:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-bson:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-variant:
+    status: full
+  logical-geometry:
+    status: full
+  logical-geography:
+    status: full
+  logical-list:
+    status: full
+  logical-map:
+    status: full
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: full
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: none
+    note: Partial read support, but only in the case of level data with a 
bitwidth of 0
+  encoding-delta-binary-packed:
+    status: full
+  encoding-delta-length-byte-array:
+    status: full
+  encoding-delta-byte-array:
+    status: full
+  encoding-byte-stream-split:
+    status: full
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: full
+  compression-gzip:
+    status: full
+  compression-lz4-deprecated:
+    status: full
+  compression-lz4-raw:
+    status: full
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: full
+  format-bloom-filters:
+    status: full
+  format-bloom-filter-length:
+    status: full
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: full
+  format-page-crc32:
+    status: full
+  format-modular-encryption:
+    status: full
+  format-size-statistics:
+    status: full
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: none
+  api-sorting-columns:
+    status: full
+  api-rowgroup-pruning-stats:
+    status: full
+  api-rowgroup-pruning-bloom:
+    status: full
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: full
diff --git a/data/implementations/support/arrow.yaml 
b/data/implementations/support/arrow.yaml
new file mode 100644
index 0000000..12d9f9e
--- /dev/null
+++ b/data/implementations/support/arrow.yaml
@@ -0,0 +1,125 @@
+engine_id: arrow
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: full
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: none
+  logical-uuid:
+    status: none
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: full
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: full
+  logical-json:
+    status: full
+  logical-bson:
+    status: none
+  logical-variant:
+    status: unknown
+  logical-geometry:
+    status: full
+  logical-geography:
+    status: full
+  logical-list:
+    status: full
+  logical-map:
+    status: full
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: full
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: full
+  encoding-delta-binary-packed:
+    status: full
+  encoding-delta-length-byte-array:
+    status: full
+  encoding-delta-byte-array:
+    status: full
+  encoding-byte-stream-split:
+    status: full
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: full
+  compression-gzip:
+    status: full
+  compression-lz4-deprecated:
+    status: full
+  compression-lz4-raw:
+    status: full
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: full
+  format-bloom-filters:
+    status: read
+  format-bloom-filter-length:
+    status: read
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: full
+  format-page-crc32:
+    status: full
+  format-modular-encryption:
+    status: full
+  format-size-statistics:
+    status: full
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: full
+  api-sorting-columns:
+    status: full
+  api-rowgroup-pruning-stats:
+    status: none
+  api-rowgroup-pruning-bloom:
+    status: none
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: none
diff --git a/data/implementations/support/cudf.yaml 
b/data/implementations/support/cudf.yaml
new file mode 100644
index 0000000..973339e
--- /dev/null
+++ b/data/implementations/support/cudf.yaml
@@ -0,0 +1,125 @@
+engine_id: cudf
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: full
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: none
+  logical-uuid:
+    status: none
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: full
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: none
+  logical-json:
+    status: none
+  logical-bson:
+    status: none
+  logical-variant:
+    status: none
+  logical-geometry:
+    status: none
+  logical-geography:
+    status: none
+  logical-list:
+    status: full
+  logical-map:
+    status: full
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: full
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: read
+  encoding-delta-binary-packed:
+    status: full
+  encoding-delta-length-byte-array:
+    status: full
+  encoding-delta-byte-array:
+    status: full
+  encoding-byte-stream-split:
+    status: full
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: read
+  compression-gzip:
+    status: read
+  compression-lz4-deprecated:
+    status: none
+  compression-lz4-raw:
+    status: full
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: full
+  format-bloom-filters:
+    status: read
+  format-bloom-filter-length:
+    status: read
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: full
+  format-page-crc32:
+    status: none
+  format-modular-encryption:
+    status: none
+  format-size-statistics:
+    status: full
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: write
+  api-sorting-columns:
+    status: write
+  api-rowgroup-pruning-stats:
+    status: full
+  api-rowgroup-pruning-bloom:
+    status: full
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: none
diff --git a/data/implementations/support/duckdb.yaml 
b/data/implementations/support/duckdb.yaml
new file mode 100644
index 0000000..8e459b3
--- /dev/null
+++ b/data/implementations/support/duckdb.yaml
@@ -0,0 +1,126 @@
+engine_id: duckdb
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: read
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: full
+  logical-uuid:
+    status: full
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: read
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: full
+  logical-json:
+    status: full
+  logical-bson:
+    status: none
+  logical-variant:
+    status: full
+  logical-geometry:
+    status: full
+  logical-geography:
+    status: full
+  logical-list:
+    status: full
+  logical-map:
+    status: full
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: read
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: none
+  encoding-delta-binary-packed:
+    status: full
+  encoding-delta-length-byte-array:
+    status: full
+  encoding-delta-byte-array:
+    status: full
+  encoding-byte-stream-split:
+    status: full
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: full
+  compression-gzip:
+    status: full
+  compression-lz4-deprecated:
+    status: none
+  compression-lz4-raw:
+    status: full
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: full
+  format-bloom-filters:
+    status: full
+  format-bloom-filter-length:
+    status: full
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: read
+  format-page-crc32:
+    status: read
+  format-modular-encryption:
+    status: full
+    note: Partial support
+  format-size-statistics:
+    status: read
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: none
+  api-sorting-columns:
+    status: read
+  api-rowgroup-pruning-stats:
+    status: full
+  api-rowgroup-pruning-bloom:
+    status: full
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: none
diff --git a/data/implementations/support/hyparquet.yaml 
b/data/implementations/support/hyparquet.yaml
new file mode 100644
index 0000000..a570dbe
--- /dev/null
+++ b/data/implementations/support/hyparquet.yaml
@@ -0,0 +1,125 @@
+engine_id: hyparquet
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: read
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: full
+  logical-uuid:
+    status: full
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: full
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: full
+  logical-json:
+    status: full
+  logical-bson:
+    status: none
+  logical-variant:
+    status: none
+  logical-geometry:
+    status: full
+  logical-geography:
+    status: full
+  logical-list:
+    status: read
+  logical-map:
+    status: read
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: full
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: read
+  encoding-delta-binary-packed:
+    status: read
+  encoding-delta-length-byte-array:
+    status: read
+  encoding-delta-byte-array:
+    status: read
+  encoding-byte-stream-split:
+    status: read
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: read
+  compression-gzip:
+    status: read
+  compression-lz4-deprecated:
+    status: read
+  compression-lz4-raw:
+    status: read
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: read
+  format-bloom-filters:
+    status: unknown
+  format-bloom-filter-length:
+    status: unknown
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: read
+  format-page-crc32:
+    status: none
+  format-modular-encryption:
+    status: none
+  format-size-statistics:
+    status: unknown
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: full
+  api-sorting-columns:
+    status: none
+  api-rowgroup-pruning-stats:
+    status: none
+  api-rowgroup-pruning-bloom:
+    status: none
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: none
diff --git a/data/implementations/support/parquet-java.yaml 
b/data/implementations/support/parquet-java.yaml
new file mode 100644
index 0000000..d6811ee
--- /dev/null
+++ b/data/implementations/support/parquet-java.yaml
@@ -0,0 +1,129 @@
+engine_id: parquet-java
+last_updated: "2025-12-09"
+support:
+  physical-boolean:
+    status: full
+  physical-int32:
+    status: full
+  physical-int64:
+    status: full
+  physical-int96:
+    status: full
+  physical-float:
+    status: full
+  physical-double:
+    status: full
+  physical-byte-array:
+    status: full
+  physical-fixed-len-byte-array:
+    status: full
+  logical-string:
+    status: full
+  logical-enum:
+    status: full
+  logical-uuid:
+    status: full
+  logical-int-types:
+    status: full
+  logical-decimal-int32:
+    status: full
+  logical-decimal-int64:
+    status: full
+  logical-decimal-byte-array:
+    status: full
+  logical-decimal-fixed-len-byte-array:
+    status: full
+  logical-float16:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-date:
+    status: full
+  logical-time-int32:
+    status: full
+  logical-time-int64:
+    status: full
+  logical-timestamp-int64:
+    status: full
+  logical-interval:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-json:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-bson:
+    status: full
+    note: Only supported to use its annotated physical type
+  logical-variant:
+    status: full
+  logical-geometry:
+    status: full
+  logical-geography:
+    status: full
+  logical-list:
+    status: full
+  logical-map:
+    status: full
+  logical-unknown:
+    status: full
+  encoding-plain:
+    status: full
+  encoding-plain-dictionary:
+    status: full
+  encoding-rle-dictionary:
+    status: full
+  encoding-rle:
+    status: full
+  encoding-bit-packed:
+    status: full
+  encoding-delta-binary-packed:
+    status: full
+  encoding-delta-length-byte-array:
+    status: full
+  encoding-delta-byte-array:
+    status: full
+  encoding-byte-stream-split:
+    status: full
+  compression-uncompressed:
+    status: full
+  compression-brotli:
+    status: full
+  compression-gzip:
+    status: full
+  compression-lz4-deprecated:
+    status: none
+  compression-lz4-raw:
+    status: full
+  compression-lzo:
+    status: none
+  compression-snappy:
+    status: full
+  compression-zstd:
+    status: full
+  format-bloom-filters:
+    status: full
+  format-bloom-filter-length:
+    status: full
+  format-stats-min-max:
+    status: full
+  format-page-index:
+    status: full
+  format-page-crc32:
+    status: full
+  format-modular-encryption:
+    status: full
+  format-size-statistics:
+    status: full
+  format-data-page-v2:
+    status: full
+  api-external-column-data:
+    status: full
+  api-sorting-columns:
+    status: none
+  api-rowgroup-pruning-stats:
+    status: full
+  api-rowgroup-pruning-bloom:
+    status: full
+  api-column-projection:
+    status: full
+  api-page-pruning-stats:
+    status: full
diff --git a/layouts/shortcodes/implementation-status.html 
b/layouts/shortcodes/implementation-status.html
new file mode 100644
index 0000000..3113516
--- /dev/null
+++ b/layouts/shortcodes/implementation-status.html
@@ -0,0 +1,135 @@
+{{- /*
+  Render implementation status tables from structured data in 
`data/implementation`
+  Usage: {{< implementation-status >}}
+*/ -}}
+
+{{- $engines := site.Data.implementations.engines -}}
+{{- $categories := site.Data.implementations.categories -}}
+{{- $legend := site.Data.implementations.legend -}}
+
+
+{{- /* Render each category */ -}}
+{{- range $categories -}}
+
+  {{- $noteMap := slice -}}
+  {{- $category := . -}}
+  {{- $categoryId := .id -}}
+  {{- $featuresData := index site.Data.implementations.features $categoryId -}}
+
+  {{- if $featuresData -}}
+    {{- $features := $featuresData.features -}}
+
+    {{- /* Render category header */ -}}
+    <h3 id="{{ $categoryId }}"><a href="#{{ $categoryId }}">{{ $category.name 
}}</a></h3>
+
+    {{- /* Render category description */ -}}
+    {{- if $category.description -}}
+      <p>{{ $category.description | markdownify }}</p>
+      {{- if $category.spec_url -}}
+        <p><a href="{{ $category.spec_url }}"><code>{{ path.Base 
$category.spec_url }}</code></a></p>
+      {{- end -}}
+      {{- if $category.spec_doc_url -}}
+        <p><a href="{{ $category.spec_doc_url }}">{{ path.Base 
$category.spec_doc_url }}</a></p>
+      {{- end -}}
+    {{- end -}}
+
+    {{- /* Render table */ -}}
+    <table class="table table-striped">
+      <thead>
+        <tr>
+          <th>{{ $category.header }}</th>
+          {{- range $engines -}}
+            <th>{{ .name }}</th>
+          {{- end -}}
+        </tr>
+      </thead>
+      <tbody>
+        {{- range $features -}}
+          {{- $feature := . -}}
+          {{- $featureId := .id -}}
+
+          <tr>
+            <td>
+              {{- if .spec_url -}}
+                <a href="{{ .spec_url }}">{{ .display_name }}</a>
+              {{- else -}}
+                {{ .display_name }}
+              {{- end -}}
+              
+              {{- if .note -}}
+               {{- $present := false }}
+               {{- $noteCounter := 0 -}}
+               {{- range $noteRowIndex, $noteRow :=  $noteMap -}}
+                   {{- $noteStr := $feature.note -}}
+                   {{- if ne $noteStr (index $noteRow 1)  -}}
+                     {{- $noteCounter = add $noteCounter 1 -}}
+                   {{- end -}}
+               {{- end -}}
+               {{- if eq $noteCounter (len $noteMap)}}
+                 {{- $noteRow := slice (cast.ToString $noteCounter) .note 
$category.id }}
+                 {{- if eq (len $noteMap) 0 -}}
+                   {{- $noteMap = $noteMap | append (slice $noteRow) -}}
+                 {{- else -}}
+                    {{- $noteMap = $noteMap | append $noteRow -}}
+                 {{- end -}}
+               {{- end -}}
+                <a href="#note-{{ $category.id }}-{{ $noteCounter }}"><sup>{{ 
add $noteCounter 1 }}</sup></a>
+              {{- end -}}
+            </td>
+            {{- range $engines -}}
+              {{- $engineId := .id -}}
+
+              {{- /* Get support status inline */ -}}
+              {{- $supportData := index site.Data.implementations.support 
$engineId -}}
+              {{- $status := "unknown" -}}
+              {{- $noteHtml := "" -}}
+
+              {{- $noteCounter := 0 -}}
+              {{- $newNote := false -}}
+              {{- if $supportData -}}
+                {{- $support := index $supportData.support $featureId -}}
+                {{- if $support -}}
+                  {{- $status = $support.status -}}
+                  {{- if $support.note -}}
+                     {{- $newNote = true -}}
+                     {{- $present := false }}
+                     {{- range $noteRowIndex, $noteRow :=  $noteMap -}}
+                       {{- $noteStr := $support.note -}}
+                       {{- if ne $noteStr (index $noteRow 1)  -}}
+                         {{- $noteCounter = add $noteCounter 1 -}}
+                       {{- end -}}
+                     {{- end -}}
+                     {{- if eq $noteCounter (len $noteMap)}}
+                       {{- $noteRow := slice (cast.ToString $noteCounter) 
$support.note $category.id }}
+                       {{- if eq (len $noteMap) 0 -}}
+                         {{- $noteMap = $noteMap | append (slice $noteRow) -}}
+                       {{- else -}}
+                         {{- $noteMap = $noteMap | append $noteRow -}}
+                       {{- end -}}
+                     {{- end -}}
+              {{- end -}}
+
+                {{- end -}}
+              {{- end -}}
+
+              {{- $statusInfo := index $legend.symbols $status -}}
+              <td class="{{ $statusInfo.class }}">
+                {{ $statusInfo.display }}
+                {{- if $newNote -}}
+                  <a href="#note-{{ $category.id }}-{{ $noteCounter }}">({{ 
add $noteCounter 1 }})</a>
+                {{- end -}}
+              </td>
+            {{- end -}}
+          </tr>
+        {{- end -}}
+      </tbody>
+    </table>
+    {{- /* Render footnotes if any */ -}}
+    {{- if gt (len $noteMap) 0 -}}   
+      <b>Notes:</b>
+      {{- range $noteRowIndex, $noteRow := $noteMap }}
+        <div id="note-{{ index $noteRow 2}}-{{index $noteRow 0 }}">({{ add 
$noteRowIndex 1}})&nbsp{{ index $noteRow 1 }}</div>
+      {{- end -}}
+    {{- end -}}
+  {{- end -}}
+{{- end -}}

Reply via email to