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]) {