@druck-editorial/engine 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/render.js +52 -21
- package/package.json +1 -1
package/dist/render.js
CHANGED
|
@@ -12,18 +12,19 @@ function titleWithAccent(title, accentWord) {
|
|
|
12
12
|
const idx = safe.indexOf(safeWord);
|
|
13
13
|
return safe.slice(0, idx) + `<em class="accent-word">${safeWord}</em>` + safe.slice(idx + safeWord.length);
|
|
14
14
|
}
|
|
15
|
-
function renderChapter(num, total, chapter) {
|
|
15
|
+
function renderChapter(num, total, chapter, lang) {
|
|
16
16
|
const titleHtml = titleWithAccent(chapter.title, chapter.titleAccentWord);
|
|
17
17
|
const body = transformInlineBlocks(chapter.bodyHtml);
|
|
18
|
+
const labels = uiLabels(lang);
|
|
18
19
|
return ('<section class="chapter-panel">' +
|
|
19
20
|
'<div class="chapter-head">' +
|
|
20
|
-
`<div class="chapter-num"
|
|
21
|
+
`<div class="chapter-num">${labels.chapter} ${escapeHtml(String(num))} · ${labels.chapterOf} ${String(total).padStart(2, '0')}</div>` +
|
|
21
22
|
`<h2 class="chapter-title">${titleHtml}</h2>` +
|
|
22
23
|
'</div>' +
|
|
23
24
|
`<div class="chapter-body">${body}</div>` +
|
|
24
25
|
'</section>');
|
|
25
26
|
}
|
|
26
|
-
function renderKeyPoints(points) {
|
|
27
|
+
function renderKeyPoints(points, lang) {
|
|
27
28
|
if (!points?.length)
|
|
28
29
|
return '';
|
|
29
30
|
const items = points
|
|
@@ -31,7 +32,7 @@ function renderKeyPoints(points) {
|
|
|
31
32
|
.map((p, i) => `<div class="kp-item"><div class="n">${String(i + 1).padStart(2, '0')}</div><p>${escapeHtml(p.text)}</p></div>`)
|
|
32
33
|
.join('');
|
|
33
34
|
return ('<section class="key-points">' +
|
|
34
|
-
|
|
35
|
+
`<div class="lbl">${uiLabels(lang).threeThings}</div>` +
|
|
35
36
|
`<div class="key-points-grid">${items}</div>` +
|
|
36
37
|
'</section>');
|
|
37
38
|
}
|
|
@@ -42,30 +43,60 @@ function renderKnowCard(items, label, kind) {
|
|
|
42
43
|
`<ul>${lis || '<li>—</li>'}</ul>` +
|
|
43
44
|
'</div>');
|
|
44
45
|
}
|
|
45
|
-
function renderKnowCards(known, unknown) {
|
|
46
|
+
function renderKnowCards(known, unknown, lang) {
|
|
46
47
|
const k = known?.items ?? [];
|
|
47
48
|
const u = unknown?.items ?? [];
|
|
48
49
|
if (!k.length && !u.length)
|
|
49
50
|
return '';
|
|
51
|
+
const labels = uiLabels(lang);
|
|
50
52
|
return ('<aside class="know-cards" role="note">' +
|
|
51
|
-
renderKnowCard(k,
|
|
52
|
-
renderKnowCard(u,
|
|
53
|
+
renderKnowCard(k, labels.knowYes, 'yes') +
|
|
54
|
+
renderKnowCard(u, labels.knowNo, 'no') +
|
|
53
55
|
'</aside>');
|
|
54
56
|
}
|
|
55
|
-
function renderEditorsNote(angle, sourceCount) {
|
|
57
|
+
function renderEditorsNote(angle, sourceCount, lang) {
|
|
56
58
|
if (!angle)
|
|
57
59
|
return '';
|
|
58
|
-
const
|
|
60
|
+
const labels = uiLabels(lang);
|
|
59
61
|
return ('<aside class="editors-note" role="note">' +
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
`<b>${
|
|
62
|
+
`<span class="lbl">${labels.editorsNote}</span> ` +
|
|
63
|
+
`${labels.writtenBy(sourceCount ?? 1)} ` +
|
|
64
|
+
`<b>${labels.angle}</b> ${escapeHtml(angle)}` +
|
|
63
65
|
'</aside>');
|
|
64
66
|
}
|
|
65
|
-
|
|
67
|
+
const UI_LABELS = {
|
|
68
|
+
en: {
|
|
69
|
+
share: 'Share this story',
|
|
70
|
+
byEditorial: 'By Editorial',
|
|
71
|
+
chapter: 'Chapter',
|
|
72
|
+
chapterOf: 'of',
|
|
73
|
+
threeThings: 'Three things to know',
|
|
74
|
+
knowYes: 'What we know',
|
|
75
|
+
knowNo: "What we don't",
|
|
76
|
+
editorsNote: "Editor's note",
|
|
77
|
+
writtenBy: (n) => `Written by Druck's editorial agent from <b>${n} sources</b>.`,
|
|
78
|
+
angle: "Druck's angle:",
|
|
79
|
+
},
|
|
80
|
+
de: {
|
|
81
|
+
share: 'Diesen Artikel teilen',
|
|
82
|
+
byEditorial: 'Von der Redaktion',
|
|
83
|
+
chapter: 'Kapitel',
|
|
84
|
+
chapterOf: 'von',
|
|
85
|
+
threeThings: 'Drei Dinge vorab',
|
|
86
|
+
knowYes: 'Was wir wissen',
|
|
87
|
+
knowNo: 'Was wir nicht wissen',
|
|
88
|
+
editorsNote: 'Anmerkung der Redaktion',
|
|
89
|
+
writtenBy: (n) => `Von Drucks Redaktions-KI aus <b>${n} Quellen</b> geschrieben.`,
|
|
90
|
+
angle: 'Drucks Blickwinkel:',
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
function uiLabels(lang) {
|
|
94
|
+
return UI_LABELS[lang] ?? UI_LABELS.en;
|
|
95
|
+
}
|
|
96
|
+
function renderShareBar(title, url, lang) {
|
|
66
97
|
const shareUrl = url ?? '#';
|
|
67
98
|
return ('<div class="article-share-bar">' +
|
|
68
|
-
|
|
99
|
+
`<span class="article-share-bar-label">${uiLabels(lang).share}</span>` +
|
|
69
100
|
'<div class="article-share-bar-actions">' +
|
|
70
101
|
`<button class="share-btn-pill" data-share-button data-share-title="${escapeHtml(title)}" data-share-url="${escapeHtml(shareUrl)}" aria-label="Share article">` +
|
|
71
102
|
'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
@@ -116,13 +147,13 @@ export function renderArticle(data, opts) {
|
|
|
116
147
|
}
|
|
117
148
|
function renderFeatureArticle(data, ctx) {
|
|
118
149
|
const chaptersHtml = (data.chapters ?? [])
|
|
119
|
-
.map((ch, i) => renderChapter(i + 1, data.chapters.length, ch))
|
|
150
|
+
.map((ch, i) => renderChapter(i + 1, data.chapters.length, ch, ctx.lang))
|
|
120
151
|
.join('');
|
|
121
152
|
const bodyHtml = transformInlineBlocks(data.bodyHtml ?? chaptersHtml);
|
|
122
153
|
const readingSpan = data.readingTime ? `<span>${escapeHtml(data.readingTime)}</span>` : '';
|
|
123
154
|
const byline = data.byline
|
|
124
155
|
? `<span>${escapeHtml(data.byline.author)}</span><span>${escapeHtml(data.byline.date)}</span>${readingSpan}`
|
|
125
|
-
: `<span
|
|
156
|
+
: `<span>${uiLabels(ctx.lang).byEditorial}</span>${readingSpan}`;
|
|
126
157
|
return (`<article class="article-shell ${ctx.catClass}">` +
|
|
127
158
|
'<div class="article-progress" aria-hidden="true"><div class="fill"></div></div>' +
|
|
128
159
|
'<header class="article-hero">' +
|
|
@@ -136,12 +167,12 @@ function renderFeatureArticle(data, ctx) {
|
|
|
136
167
|
(data.heroImage
|
|
137
168
|
? `<figure class="article-hero-img"><img src="${escapeHtml(safeUrl(data.heroImage))}" alt="${escapeHtml(data.heroImageAlt ?? data.title)}" loading="eager" fetchpriority="high" width="${safeDimension(data.heroImageWidth, 1920)}" height="${safeDimension(data.heroImageHeight, 1080)}"></figure>`
|
|
138
169
|
: '') +
|
|
139
|
-
renderEditorsNote(data.editorsNote, data.sourceCount) +
|
|
170
|
+
renderEditorsNote(data.editorsNote, data.sourceCount, ctx.lang) +
|
|
140
171
|
`<div class="article-body">${bodyHtml}</div>` +
|
|
141
|
-
renderKeyPoints(data.keyPoints) +
|
|
142
|
-
renderKnowCards(data.known, data.unknown) +
|
|
172
|
+
renderKeyPoints(data.keyPoints, ctx.lang) +
|
|
173
|
+
renderKnowCards(data.known, data.unknown, ctx.lang) +
|
|
143
174
|
renderRelated(data.related) +
|
|
144
|
-
renderShareBar(data.title, data.shareUrl) +
|
|
175
|
+
renderShareBar(data.title, data.shareUrl, ctx.lang) +
|
|
145
176
|
'</article>');
|
|
146
177
|
}
|
|
147
178
|
function renderWireArticle(data, ctx) {
|
|
@@ -163,7 +194,7 @@ function renderWireArticle(data, ctx) {
|
|
|
163
194
|
? `<aside class="editors-note" role="note"><span class="lbl">Why it matters</span> ${escapeHtml(data.whyItMatters)}</aside>`
|
|
164
195
|
: '') +
|
|
165
196
|
renderRelated(data.related) +
|
|
166
|
-
renderShareBar(data.title, data.shareUrl) +
|
|
197
|
+
renderShareBar(data.title, data.shareUrl, ctx.lang) +
|
|
167
198
|
'</article>');
|
|
168
199
|
}
|
|
169
200
|
export function renderCard(data, opts) {
|
package/package.json
CHANGED