Skip to content

Commit 7cad843

Browse files
frettieclaude
authored andcommitted
Denik CZ: Update for redesigned site
Site redesign broke the 2018 translator: author meta tag and listing selectors are gone. Rebuild on EM + JSON-LD (authors, date, section, tags, regional edition name as publicationTitle), modernize to async doWeb/requestDocument, refresh test cases. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 7eee300 commit 7cad843

1 file changed

Lines changed: 146 additions & 145 deletions

File tree

Denik CZ.js

Lines changed: 146 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33
"label": "Denik CZ",
44
"creator": "Jiří Sedláček, Philipp Zumstein",
55
"target": "^https?://[^/]*denik\\.cz",
6-
"minVersion": "3.0",
6+
"minVersion": "5.0",
77
"maxVersion": "",
88
"priority": 100,
99
"inRepository": true,
1010
"translatorType": 4,
1111
"browserSupport": "gcsibv",
12-
"lastUpdated": "2018-01-07 09:27:42"
12+
"lastUpdated": "2026-08-13 17:04:12"
1313
}
1414

1515
/*
1616
***** BEGIN LICENSE BLOCK *****
1717
18-
Copyright © 2017 Jiří Sedláček, Philipp Zumstein
19-
18+
Copyright © 2017-2026 Jiří Sedláček, Philipp Zumstein
19+
2020
This file is part of Zotero.
2121
2222
Zotero is free software: you can redistribute it and/or modify
@@ -35,23 +35,23 @@
3535
***** END LICENSE BLOCK *****
3636
*/
3737

38-
function detectWeb(doc, url) {
39-
var type = ZU.xpathText(doc, '//meta[@property="og:type"]/@content');
40-
if (type == "article") {
41-
return "newspaperArticle";
42-
} else if (getSearchResults(doc, true)) {
43-
return "multiple";
38+
function detectWeb(doc, url) { // eslint-disable-line no-unused-vars
39+
if (attr(doc, 'meta[property="og:type"]', 'content') == 'article') {
40+
return 'newspaperArticle';
41+
}
42+
else if (getSearchResults(doc, true)) {
43+
return 'multiple';
4444
}
45+
return false;
4546
}
4647

47-
4848
function getSearchResults(doc, checkOnly) {
4949
var items = {};
5050
var found = false;
51-
var rows = doc.querySelectorAll('.right h2 a');
52-
for (let i=0; i<rows.length; i++) {
53-
let href = rows[i].href;
54-
let title = ZU.trimInternal(rows[i].textContent);
51+
var rows = doc.querySelectorAll('article h2 a');
52+
for (let row of rows) {
53+
let href = row.href;
54+
let title = ZU.trimInternal(row.textContent);
5555
if (!href || !title) continue;
5656
if (checkOnly) return true;
5757
found = true;
@@ -60,208 +60,209 @@ function getSearchResults(doc, checkOnly) {
6060
return found ? items : false;
6161
}
6262

63+
async function doWeb(doc, url) {
64+
if (detectWeb(doc, url) == 'multiple') {
65+
let items = await Zotero.selectItems(getSearchResults(doc, false));
66+
if (!items) return;
67+
for (let url of Object.keys(items)) {
68+
await scrape(await requestDocument(url));
69+
}
70+
}
71+
else {
72+
await scrape(doc, url);
73+
}
74+
}
6375

64-
function doWeb(doc, url) {
65-
if (detectWeb(doc, url) == "multiple") {
66-
Zotero.selectItems(getSearchResults(doc, false), function (items) {
67-
if (!items) {
68-
return true;
76+
function getJSONLDGraph(doc) {
77+
for (let script of doc.querySelectorAll('script[type="application/ld+json"]')) {
78+
try {
79+
let data = JSON.parse(script.textContent);
80+
let graph = data['@graph'] || (Array.isArray(data) ? data : [data]);
81+
if (graph.some(node => node['@type'] == 'NewsArticle')) {
82+
return graph;
6983
}
70-
var articles = [];
71-
for (var i in items) {
72-
articles.push(i);
73-
}
74-
ZU.processDocuments(articles, scrape);
75-
});
76-
} else {
77-
scrape(doc, url);
84+
}
85+
catch (e) {}
7886
}
87+
return [];
7988
}
8089

90+
async function scrape(doc, url = doc.location.href) {
91+
let graph = getJSONLDGraph(doc);
92+
let article = graph.find(node => node['@type'] == 'NewsArticle');
93+
let organization = graph.find(node => node['@type'] == 'NewsMediaOrganization');
8194

82-
function scrape(doc, url) {
83-
var authorsMeta = ZU.xpathText(doc, '//meta[@property="author"]/@content');
84-
85-
var translator = Zotero.loadTranslator('web');
95+
let translator = Zotero.loadTranslator('web');
8696
// Embedded Metadata
8797
translator.setTranslator('951c027d-74ac-47d4-a107-9c3069ab7b48');
88-
// translator.setDocument(doc);
89-
90-
translator.setHandler('itemDone', function (obj, item) {
91-
if (authorsMeta) {
92-
// multiple authors are not handled correctly by EM and
93-
// we want to exclude generic names like "Redakce"
98+
translator.setDocument(doc);
99+
100+
translator.setHandler('itemDone', (_obj, item) => {
101+
if (article) {
102+
// exclude generic names like "Redakce"
94103
item.creators = [];
95-
let authorsList = authorsMeta.split(/\s*,\s*/);
96-
for (let i=0; i<authorsList.length; i++) {
97-
let author = authorsList[i];
98-
if (author!= "Redakce") {
99-
item.creators.push(ZU.cleanAuthor(authorsList[i], "author"));
104+
let authors = Array.isArray(article.author) ? article.author : [article.author];
105+
for (let author of authors) {
106+
if (author && author.name && author.name != 'Redakce') {
107+
item.creators.push(ZU.cleanAuthor(author.name, 'author'));
100108
}
101109
}
110+
111+
if (article.datePublished) {
112+
item.date = ZU.strToISO(article.datePublished);
113+
}
114+
if (article.articleSection) {
115+
item.section = article.articleSection;
116+
}
117+
if (Array.isArray(article.keywords)) {
118+
item.tags = article.keywords.map(tag => ({ tag }));
119+
}
120+
}
121+
if (organization && organization.name) {
122+
// og:site_name is always "www.denik.cz"; the regional edition
123+
// name (e.g. "Třebíčský deník") is only in the JSON-LD
124+
item.publicationTitle = organization.name;
125+
}
126+
if (!item.language) {
127+
item.language = 'cs';
102128
}
103-
104129
item.complete();
105130
});
106131

107-
translator.getTranslatorObject(function(trans) {
108-
trans.itemType = "newspaperArticle";
109-
trans.doWeb(doc, url);
110-
});
132+
let em = await translator.getTranslatorObject();
133+
em.itemType = 'newspaperArticle';
134+
await em.doWeb(doc, url);
111135
}
112136

113137
/** BEGIN TEST CASES **/
114138
var testCases = [
115139
{
116140
"type": "web",
117-
"url": "https://trebicsky.denik.cz/zpravy_region/podivejte-se-dalsi-na-miminka-narozena-na-trebicsku-20170123.html",
141+
"url": "https://trebicsky.denik.cz/zpravy-region/trebic-bude-mit-nocni-autobus-umozni-spojeni-na-vlak-i-pohodlny-navrat-z-klubu/",
118142
"items": [
119143
{
120144
"itemType": "newspaperArticle",
121-
"title": "Podívejte se další na miminka narozená na Třebíčsku",
122-
"creators": [],
123-
"date": "2017-01-23T08:20:00+01:00",
124-
"abstractNote": "Třebíčsko - Díky vstřícnosti třebíčské porodnice Vám přinášíme fotografie nejmladších obyvatel. Každý týden naši spolupracovníci objíždí porodnice a fotí nově narozená miminka.",
125-
"language": "cs",
126-
"libraryCatalog": "trebicsky.denik.cz",
127-
"publicationTitle": "Třebíčský deník",
128-
"url": "https://trebicsky.denik.cz/zpravy_region/podivejte-se-dalsi-na-miminka-narozena-na-trebicsku-20170123.html",
129-
"attachments": [
145+
"creators": [
130146
{
131-
"title": "Snapshot"
147+
"firstName": "Milan",
148+
"lastName": "Krčmář",
149+
"creatorType": "author"
132150
}
133151
],
134-
"tags": [],
135152
"notes": [],
136-
"seeAlso": []
137-
}
138-
]
139-
},
140-
{
141-
"type": "web",
142-
"url": "https://trebicsky.denik.cz/zpravy_region/pyrotechniku-pouzivejte-ohleduplne-a-bezpecne-doporucuji-hasici-20171231.html",
143-
"items": [
144-
{
145-
"itemType": "newspaperArticle",
146-
"title": "Pyrotechniku používejte ohleduplně a bezpečně, doporučují hasiči",
147-
"creators": [
153+
"tags": [
148154
{
149-
"firstName": "Luděk",
150-
"lastName": "Mahel",
151-
"creatorType": "author"
155+
"tag": "Brno"
156+
},
157+
{
158+
"tag": "Karlovo náměstí"
159+
},
160+
{
161+
"tag": "Třebíč"
162+
},
163+
{
164+
"tag": "jízdní řád"
165+
},
166+
{
167+
"tag": "sídliště"
168+
},
169+
{
170+
"tag": "čtvrť"
171+
},
172+
{
173+
"tag": "železniční stanice"
152174
}
153175
],
154-
"date": "2017-12-31T10:08:00+01:00",
155-
"abstractNote": "Třebíčsko - Přivítání nového roku se neobejde bez petard a rachejtlí. Jak pyrotechniku správně používat? Zde jsou některá doporučení.",
156-
"language": "cs",
157-
"libraryCatalog": "trebicsky.denik.cz",
158-
"publicationTitle": "Třebíčský deník",
159-
"url": "https://trebicsky.denik.cz/zpravy_region/pyrotechniku-pouzivejte-ohleduplne-a-bezpecne-doporucuji-hasici-20171231.html",
176+
"seeAlso": [],
160177
"attachments": [
161178
{
162-
"title": "Snapshot"
179+
"title": "Snapshot",
180+
"mimeType": "text/html"
163181
}
164182
],
165-
"tags": [],
166-
"notes": [],
167-
"seeAlso": []
183+
"title": "Třebíč bude mít noční autobus. Umožní spojení na vlak i pohodlný návrat z klubů",
184+
"publicationTitle": "Třebíčský deník",
185+
"url": "https://trebicsky.denik.cz/zpravy-region/trebic-bude-mit-nocni-autobus-umozni-spojeni-na-vlak-i-pohodlny-navrat-z-klubu/",
186+
"abstractNote": "V Třebíči se od 29. června změní jízdní řády městských autobusů. Novinkou je zkušební zavedení noční linky, která má návaznost na noční a ranní vlaky.",
187+
"date": "2026-06-24",
188+
"language": "cs",
189+
"libraryCatalog": "trebicsky.denik.cz",
190+
"section": "Třebíčsko"
168191
}
169192
]
170193
},
171194
{
172195
"type": "web",
173-
"url": "https://www.denik.cz/z_domova/silvestr-se-zachrankou-ustrelena-ruka-agrese-i-slzy-zoufalstvi-20180101.html",
196+
"url": "https://www.denik.cz/evropa/dalsi-zatmeni-slunce-evropa-cesko-spanelsko-egypt/",
174197
"items": [
175198
{
176199
"itemType": "newspaperArticle",
177-
"title": "Silvestr se záchrankou: Ustřelená ruka, agrese i slzy zoufalství",
178200
"creators": [
179201
{
180-
"firstName": "Jiří",
181-
"lastName": "Sejkora",
202+
"firstName": "Tomáš",
203+
"lastName": "Rosa",
182204
"creatorType": "author"
183205
}
184206
],
185-
"date": "2018-01-01T14:22:00+01:00",
186-
"abstractNote": "/FOTOGALERIE, VIDEO/ Silvestrovská noční služba se záchranáři v Pardubicích očima redaktora Deníku. Podívejte se, čím vším si musí projít první den nového roku.",
187-
"language": "cs",
188-
"libraryCatalog": "www.denik.cz",
189-
"publicationTitle": "Deník.cz",
190-
"shortTitle": "Silvestr se záchrankou",
191-
"url": "https://www.denik.cz/z_domova/silvestr-se-zachrankou-ustrelena-ruka-agrese-i-slzy-zoufalstvi-20180101.html",
192-
"attachments": [
193-
{
194-
"title": "Snapshot"
195-
}
196-
],
207+
"notes": [],
197208
"tags": [
198209
{
199-
"tag": "Pardubice"
210+
"tag": "Egypt"
200211
},
201212
{
202-
"tag": "silvestr"
213+
"tag": "Evropa"
203214
},
204215
{
205-
"tag": "záchranná služba"
206-
}
207-
],
208-
"notes": [],
209-
"seeAlso": []
210-
}
211-
]
212-
},
213-
{
214-
"type": "web",
215-
"url": "https://www.denik.cz/ze_sveta/co-nas-ceka-v-breznu-prezidentske-volby-v-rusku-sanci-uspet-ma-jen-putin-20180101.html",
216-
"items": [
217-
{
218-
"itemType": "newspaperArticle",
219-
"title": "Co nás čeká v březnu? Prezidentské volby v Rusku. Šanci uspět má jen Putin",
220-
"creators": [
216+
"tag": "Evropská kosmická agentura"
217+
},
221218
{
222-
"firstName": "Michal",
223-
"lastName": "Bystrov",
224-
"creatorType": "author"
219+
"tag": "Luxor"
225220
},
226221
{
227-
"firstName": "Vojtěch",
228-
"lastName": "Žižka",
229-
"creatorType": "author"
230-
}
231-
],
232-
"date": "2018-01-02T00:30:00+01:00",
233-
"abstractNote": "Na nedávné bilanční konferenci v Moskvě potvrdil vůdce Ruské federace Vladimir Putin, že v březnu 2018 hodlá znovu kandidovat na prezidenta. Poprvé tuto informaci sdělil veřejnosti v první polovině prosince při setkání s pracovníky automobilky GAZ v Nižním Novgorodu.",
234-
"language": "cs",
235-
"libraryCatalog": "www.denik.cz",
236-
"publicationTitle": "Deník.cz",
237-
"shortTitle": "Co nás čeká v březnu?",
238-
"url": "https://www.denik.cz/ze_sveta/co-nas-ceka-v-breznu-prezidentske-volby-v-rusku-sanci-uspet-ma-jen-putin-20180101.html",
239-
"attachments": [
222+
"tag": "Měsíc"
223+
},
240224
{
241-
"title": "Snapshot"
242-
}
243-
],
244-
"tags": [
225+
"tag": "Pyrenejský poloostrov"
226+
},
245227
{
246-
"tag": "Putin"
228+
"tag": "Tarifa"
247229
},
248230
{
249-
"tag": "Rusko"
231+
"tag": "zatmění Slunce"
232+
},
233+
{
234+
"tag": "Česko"
235+
},
236+
{
237+
"tag": "Španělsko"
250238
}
251239
],
252-
"notes": [],
253-
"seeAlso": []
240+
"seeAlso": [],
241+
"attachments": [
242+
{
243+
"title": "Snapshot",
244+
"mimeType": "text/html"
245+
}
246+
],
247+
"title": "Zatmění Slunce se nad Evropu brzy vrátí. A ne jen jednou",
248+
"publicationTitle": "Deník.cz",
249+
"url": "https://www.denik.cz/evropa/dalsi-zatmeni-slunce-evropa-cesko-spanelsko-egypt/",
250+
"abstractNote": "V následujících dvou letech lidé z Evropy opět uvidí zatmění Slunce. Zatímco na jihozápadě státy zahalí tma, na zbytku kontinentu se obyvatelé dočkají alespoň částečného úkazu. V příštím roce se to bu",
251+
"date": "2026-08-13",
252+
"language": "cs",
253+
"libraryCatalog": "www.denik.cz",
254+
"section": "Evropa"
254255
}
255256
]
256257
},
257258
{
258259
"type": "web",
259-
"url": "https://www.denik.cz/hledani/?q=praha&s=all",
260+
"url": "https://trebicsky.denik.cz/zpravy-region/",
260261
"items": "multiple"
261262
},
262263
{
263264
"type": "web",
264-
"url": "https://www.denik.cz/ze_sveta/",
265+
"url": "https://www.denik.cz/hledani/?q=praha",
265266
"items": "multiple"
266267
}
267268
]

0 commit comments

Comments
 (0)