From b2684d5cee700baf2d47b5d2920c550e78aaa58c Mon Sep 17 00:00:00 2001 From: Neeldhara Misra Date: Mon, 29 Jun 2026 02:31:41 +0530 Subject: [PATCH] Normalize data table sort keys --- sites/art/src/remark/semantic-blocks.mjs | 12 ++++++++++-- sites/poetry/src/remark/semantic-blocks.mjs | 12 ++++++++++-- sites/puzzles/src/remark/semantic-blocks.mjs | 12 ++++++++++-- sites/reflections/src/remark/semantic-blocks.mjs | 12 ++++++++++-- sites/research/src/remark/semantic-blocks.mjs | 12 ++++++++++-- sites/reviews/src/remark/semantic-blocks.mjs | 12 ++++++++++-- sites/vibes/src/remark/semantic-blocks.mjs | 12 ++++++++++-- 7 files changed, 70 insertions(+), 14 deletions(-) diff --git a/sites/art/src/remark/semantic-blocks.mjs b/sites/art/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/art/src/remark/semantic-blocks.mjs +++ b/sites/art/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) { diff --git a/sites/poetry/src/remark/semantic-blocks.mjs b/sites/poetry/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/poetry/src/remark/semantic-blocks.mjs +++ b/sites/poetry/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) { diff --git a/sites/puzzles/src/remark/semantic-blocks.mjs b/sites/puzzles/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/puzzles/src/remark/semantic-blocks.mjs +++ b/sites/puzzles/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) { diff --git a/sites/reflections/src/remark/semantic-blocks.mjs b/sites/reflections/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/reflections/src/remark/semantic-blocks.mjs +++ b/sites/reflections/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) { diff --git a/sites/research/src/remark/semantic-blocks.mjs b/sites/research/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/research/src/remark/semantic-blocks.mjs +++ b/sites/research/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) { diff --git a/sites/reviews/src/remark/semantic-blocks.mjs b/sites/reviews/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/reviews/src/remark/semantic-blocks.mjs +++ b/sites/reviews/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) { diff --git a/sites/vibes/src/remark/semantic-blocks.mjs b/sites/vibes/src/remark/semantic-blocks.mjs index b4049be..a8afdbd 100644 --- a/sites/vibes/src/remark/semantic-blocks.mjs +++ b/sites/vibes/src/remark/semantic-blocks.mjs @@ -147,6 +147,15 @@ function plainText(value) { .trim(); } +function sortText(value) { + return plainText(value) + .normalize("NFKD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]+/gi, " ") + .trim() + .toLowerCase(); +} + function inlineMarkup(value) { return escapeHtml(value ?? "") .replace(/<br\s*\/?>/gi, "
") @@ -214,8 +223,7 @@ function displayValue(value) { function renderCell(row, column, options) { const raw = row[column] ?? ""; const display = displayValue(raw); - const text = plainText(display); - const sortValue = attribute(text.toLowerCase()); + const sortValue = attribute(sortText(display)); const cellAttrs = `data-column="${attribute(column)}" data-sort-value="${sortValue}"`; if (column === options.linkColumn && row[options.urlField]) {