Skip to content

Commit 9322746

Browse files
committed
🍱(frontend) manage export emoji locally
We now use exported emoji from emoji-datasource-apple package instead of relying on a CDN. During a build or dev command, the emoji images are copied from node_modules to the public assets folder. They are not versionned.
1 parent db7ae35 commit 9322746

File tree

8 files changed

+48
-5
lines changed

8 files changed

+48
-5
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ and this project adheres to
2929
- ♿ restyle checked checkboxes: removing strikethrough #1439
3030
- ♿ add h1 for SR on 40X pages and remove alt texts #1438
3131
- ♿ update labels and shared document icon accessibility #1442
32+
- 🍱(frontend) Fonts GDPR compliants #1453
3233

3334
### Fixed
3435

@@ -38,6 +39,7 @@ and this project adheres to
3839
- 🐛(frontend) fix legacy role computation #1376
3940
- 🛂(frontend) block editing title when not allowed #1412
4041
- 🐛(frontend) scroll back to top when navigate to a document #1406
42+
- 🐛(frontend) fix export pdf emoji problem #1453
4143
- 🐛(frontend) fix attachment download filename #1447
4244
- 🐛(frontend) exclude h4-h6 headings from table of contents #1441
4345
- 🔒(frontend) prevent readers from changing callout emoji #1449

src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
verifyDocName,
1212
waitForLanguageSwitch,
1313
} from './utils-common';
14+
import { openSuggestionMenu, writeInEditor } from './utils-editor';
1415
import { createRootSubPage } from './utils-sub-pages';
1516

1617
test.beforeEach(async ({ page }) => {
@@ -153,11 +154,13 @@ test.describe('Doc Export', () => {
153154

154155
await verifyDocName(page, randomDoc);
155156

156-
await page.locator('.ProseMirror.bn-editor').click();
157-
await page.locator('.ProseMirror.bn-editor').fill('Hello World');
157+
await writeInEditor({
158+
page,
159+
text: 'Hello World 😃🎉🚀🙋‍♀️🧑🏿‍❤️‍💋‍🧑🏾',
160+
});
158161

159162
await page.keyboard.press('Enter');
160-
await page.locator('.bn-block-outer').last().fill('/');
163+
await openSuggestionMenu({ page });
161164
await page.getByText('Resizable image with caption').click();
162165

163166
const fileChooserPromise = page.waitForEvent('filechooser');

src/frontend/apps/impress/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ yarn-error.log*
3737
service-worker.js
3838

3939
# Font embedding
40+
public/assets/fonts/emoji/*
41+
!public/assets/fonts/emoji/fallback.png
4042
public/assets/fonts/Marianne/*

src/frontend/apps/impress/next.config.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,21 @@ const nextConfig = {
4747
config.plugins.push(
4848
new CopyPlugin({
4949
patterns: [
50+
{
51+
from: path.resolve(
52+
__dirname,
53+
'../../node_modules/emoji-datasource-apple/img/apple/64',
54+
),
55+
to: path.resolve(__dirname, 'public/assets/fonts/emoji'),
56+
force: true,
57+
},
5058
{
5159
from: path.resolve(
5260
__dirname,
5361
'../../node_modules/@gouvfr-lasuite/ui-kit/dist/assets/fonts/Marianne',
5462
),
5563
to: path.resolve(__dirname, 'public/assets/fonts/Marianne'),
64+
force: true,
5665
},
5766
],
5867
}),

src/frontend/apps/impress/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"cmdk": "1.1.1",
4444
"crisp-sdk-web": "1.0.25",
4545
"docx": "9.5.0",
46+
"emoji-datasource-apple": "16.0.0",
4647
"emoji-mart": "5.6.0",
4748
"emoji-regex": "10.5.0",
4849
"i18next": "25.5.2",
1.97 KB
Loading

src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
useToastProvider,
1111
} from '@openfun/cunningham-react';
1212
import { DocumentProps, pdf } from '@react-pdf/renderer';
13+
import jsonemoji from 'emoji-datasource-apple' assert { type: 'json' };
1314
import i18next from 'i18next';
1415
import { cloneElement, isValidElement, useMemo, useState } from 'react';
1516
import { useTranslation } from 'react-i18next';
@@ -95,6 +96,20 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => {
9596
if (format === DocDownloadFormat.PDF) {
9697
const exporter = new PDFExporter(editor.schema, pdfDocsSchemaMappings, {
9798
resolveFileUrl: async (url) => exportCorsResolveFileUrl(doc.id, url),
99+
emojiSource: {
100+
format: 'png',
101+
builder(code) {
102+
const emoji = jsonemoji.find((e) =>
103+
e.unified.toLocaleLowerCase().includes(code.toLowerCase()),
104+
);
105+
106+
if (emoji) {
107+
return `/assets/fonts/emoji/${emoji.image}`;
108+
}
109+
110+
return '/assets/fonts/emoji/fallback.png';
111+
},
112+
},
98113
});
99114
const rawPdfDocument = (await exporter.toReactPDFDocument(
100115
exportDocument,
@@ -150,7 +165,6 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => {
150165
color="secondary"
151166
fullWidth
152167
onClick={() => onClose()}
153-
disabled={isExporting}
154168
>
155169
{t('Cancel')}
156170
</Button>

src/frontend/yarn.lock

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8633,7 +8633,7 @@ data-view-byte-offset@^1.0.1:
86338633
es-errors "^1.3.0"
86348634
is-data-view "^1.0.1"
86358635

8636-
debug@4, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1:
8636+
debug@4, debug@^4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1:
86378637
version "4.4.1"
86388638
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
86398639
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
@@ -8654,6 +8654,13 @@ debug@^3.1.0, debug@^3.2.7:
86548654
dependencies:
86558655
ms "^2.1.1"
86568656

8657+
debug@^4.3.2:
8658+
version "4.4.3"
8659+
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
8660+
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
8661+
dependencies:
8662+
ms "^2.1.3"
8663+
86578664
decimal.js@^10.4.3, decimal.js@^10.5.0:
86588665
version "10.6.0"
86598666
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a"
@@ -8907,6 +8914,11 @@ emittery@^0.13.1:
89078914
resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
89088915
integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
89098916

8917+
8918+
version "16.0.0"
8919+
resolved "https://registry.yarnpkg.com/emoji-datasource-apple/-/emoji-datasource-apple-16.0.0.tgz#c6e0794c1fd1b88765b880b2137e11d8efa94020"
8920+
integrity sha512-dVYjsK0FnCry9F+PBtnivhG2K0xdwlmqYaSgiUtztUdAGPYiHYhZcVKvNBqC791g2qyEcFNTBO6utg4eQ3uLTw==
8921+
89108922
[email protected], emoji-mart@^5.6.0:
89118923
version "5.6.0"
89128924
resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-5.6.0.tgz#71b3ed0091d3e8c68487b240d9d6d9a73c27f023"

0 commit comments

Comments
 (0)