react-notion-x
react-notion-x copied to clipboard
fix: add transliteration module to support non-latin URLs
Problem: getCanonicalPageId does not support non-latin page titles
Issue:
I am using [Notion.so](http://Notion.so) to run [FinUA.org](http://FinUA.org) website and currently it isb deployed with [super.so](http://super.so). I have been using nextjs-notion-starter-kit project for it (thank you).
As deployed the project to Vercel, I realized that there were quite a few browser warnings about the page due to generated page URLs (they looked broken).

the page behind it:

moreover, this page also had the same URL generated /- despite being a separate page, and clicking on it would lead to the first page.
I have investigated it, and it seems that the problem was in the module https://github.com/transitive-bullshit/nextjs-notion-starter-kit/blob/main/lib/get-canonical-page-id.ts
import { ExtendedRecordMap } from 'notion-types'
import {
getCanonicalPageId as getCanonicalPageIdImpl,
parsePageId
} from 'notion-utils'
import { inversePageUrlOverrides } from './config'
export function getCanonicalPageId(
pageId: string,
recordMap: ExtendedRecordMap,
{ uuid = true }: { uuid?: boolean } = {}
): string | null {
const cleanPageId = parsePageId(pageId, { uuid: false })
if (!cleanPageId) {
return null
}
const override = inversePageUrlOverrides[cleanPageId]
if (override) {
return override
} else {
// PROBLEM: this line seemed to be the issue
return getCanonicalPageIdImpl(pageId, recordMap, {
uuid
})
}
}
I went to the module https://github.com/NotionX/react-notion-x/tree/master/packages/notion-utils
and copied https://github.com/NotionX/react-notion-x/blob/master/packages/notion-utils/src/get-canonical-page-id.ts module, the problem seemed to be getCanonicalPageId function, it only seemed to work for Latin symbols normalizeTitle(getBlockTitle(block, recordMap)):
I pulled the normalizeTitle function, and yes, it seems to be the case
function normalizeTitle(title) {
return (title || '')
.replace(/ /g, '-')
.replace(/[^a-zA-Z0-9-\u4e00-\u9fa5]/g, '')
.replace(/--/g, '-')
.replace(/-$/, '')
.replace(/^-/, '')
.trim()
.toLowerCase()
}
const eng = normalizeTitle('Naapurin Maalaiskana (NMK), in Lieto, in Turku area');
const ukr = normalizeTitle('Робота помічника з обслуговування контейнерів');
const ukr1 = normalizeTitle('Ищем литейщиков в Карккила, Финляндия, для обработки изделий в металлургической промышленности');
console.log('test', eng, ukr, ukr1)
// "test"
// "naapurin-maalaiskana-nmk-in-lieto-in-turku-area"
// ""
// "---"
Solution:
The one that worked for me was just replacing normalizeTitle(getBlockTitle(block, recordMap)) with slugify from the transliteration npm package.
Notion Test Page ID
701245d6db8c413689d180e87269ee56
The latest updates on your projects. Learn more about Vercel for Git ↗︎
| Name | Status | Preview | Comments | Updated |
|---|---|---|---|---|
| react-notion-x | ✅ Ready (Inspect) | Visit Preview | 💬 Add your feedback | Jan 21, 2023 at 5:05PM (UTC) |
| react-notion-x-minimal-demo | ✅ Ready (Inspect) | Visit Preview | 💬 Add your feedback | Jan 21, 2023 at 5:05PM (UTC) |