mwoffliner 1.17.4 → 2.0.0
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/README.md +355 -62
- package/docs/functional_architecture.md +34 -38
- package/extensions/wiktionary_fr.js +18 -17
- package/jest.config.cjs +2 -2
- package/lib/DOMUtils.js +0 -1
- package/lib/DOMUtils.js.map +1 -1
- package/lib/Downloader.d.ts +39 -31
- package/lib/Downloader.js +418 -349
- package/lib/Downloader.js.map +1 -1
- package/lib/Dump.d.ts +24 -10
- package/lib/Dump.js +95 -50
- package/lib/Dump.js.map +1 -1
- package/lib/Gadgets.d.ts +2 -1
- package/lib/Gadgets.js +7 -5
- package/lib/Gadgets.js.map +1 -1
- package/lib/Logger.d.ts +6 -6
- package/lib/Logger.js +33 -33
- package/lib/Logger.js.map +1 -1
- package/lib/MediaWiki.d.ts +14 -31
- package/lib/MediaWiki.js +119 -172
- package/lib/MediaWiki.js.map +1 -1
- package/lib/RedisStore.d.ts +3 -3
- package/lib/RedisStore.js +21 -23
- package/lib/RedisStore.js.map +1 -1
- package/lib/S3.js +1 -1
- package/lib/S3.js.map +1 -1
- package/lib/Templates.d.ts +3 -10
- package/lib/Templates.js +5 -14
- package/lib/Templates.js.map +1 -1
- package/lib/cli.js +7 -6
- package/lib/cli.js.map +1 -1
- package/lib/config.d.ts +10 -16
- package/lib/config.js +33 -55
- package/lib/config.js.map +1 -1
- package/lib/error.manager.d.ts +2 -2
- package/lib/error.manager.js +42 -49
- package/lib/error.manager.js.map +1 -1
- package/lib/i18n.d.ts +2 -0
- package/lib/i18n.js +53 -0
- package/lib/i18n.js.map +1 -0
- package/lib/mutex.d.ts +2 -1
- package/lib/mutex.js +2 -1
- package/lib/mutex.js.map +1 -1
- package/lib/mwoffliner.lib.js +370 -222
- package/lib/mwoffliner.lib.js.map +1 -1
- package/lib/parameterList.d.ts +20 -8
- package/lib/parameterList.js +30 -18
- package/lib/parameterList.js.map +1 -1
- package/lib/renderers/abstract.renderer.d.ts +48 -55
- package/lib/renderers/abstract.renderer.js +377 -98
- package/lib/renderers/abstract.renderer.js.map +1 -1
- package/lib/renderers/action-parse.renderer.d.ts +22 -3
- package/lib/renderers/action-parse.renderer.js +123 -81
- package/lib/renderers/action-parse.renderer.js.map +1 -1
- package/lib/renderers/renderer.builder.js +6 -69
- package/lib/renderers/renderer.builder.js.map +1 -1
- package/lib/renderers/rendering.context.d.ts +2 -3
- package/lib/renderers/rendering.context.js +6 -14
- package/lib/renderers/rendering.context.js.map +1 -1
- package/lib/sanitize-argument.d.ts +7 -4
- package/lib/sanitize-argument.js +99 -41
- package/lib/sanitize-argument.js.map +1 -1
- package/lib/util/FileManager.d.ts +36 -0
- package/lib/util/FileManager.js +246 -0
- package/lib/util/FileManager.js.map +1 -0
- package/lib/util/RedisKvs.js +4 -4
- package/lib/util/RedisKvs.js.map +1 -1
- package/lib/util/RedisQueue.js +1 -1
- package/lib/util/RedisQueue.js.map +1 -1
- package/lib/util/builders/url/action-parse.director.d.ts +2 -2
- package/lib/util/builders/url/action-parse.director.js +7 -7
- package/lib/util/builders/url/action-parse.director.js.map +1 -1
- package/lib/util/builders/url/api.director.d.ts +2 -4
- package/lib/util/builders/url/api.director.js +10 -17
- package/lib/util/builders/url/api.director.js.map +1 -1
- package/lib/util/builders/url/base.director.d.ts +0 -4
- package/lib/util/builders/url/base.director.js +0 -25
- package/lib/util/builders/url/base.director.js.map +1 -1
- package/lib/util/builders/url/basic.director.d.ts +1 -1
- package/lib/util/builders/url/basic.director.js +1 -1
- package/lib/util/builders/url/web.director.d.ts +1 -1
- package/lib/util/builders/url/web.director.js +2 -2
- package/lib/util/builders/url/web.director.js.map +1 -1
- package/lib/util/categories.d.ts +5 -5
- package/lib/util/categories.js +175 -174
- package/lib/util/categories.js.map +1 -1
- package/lib/util/const.d.ts +4 -8
- package/lib/util/const.js +9 -17
- package/lib/util/const.js.map +1 -1
- package/lib/util/customCssJs.d.ts +6 -0
- package/lib/util/customCssJs.js +70 -0
- package/lib/util/customCssJs.js.map +1 -0
- package/lib/util/dump.d.ts +15 -4
- package/lib/util/dump.js +282 -86
- package/lib/util/dump.js.map +1 -1
- package/lib/util/index.d.ts +1 -1
- package/lib/util/index.js +1 -1
- package/lib/util/index.js.map +1 -1
- package/lib/util/metaData.js.map +1 -1
- package/lib/util/misc.d.ts +23 -13
- package/lib/util/misc.js +90 -59
- package/lib/util/misc.js.map +1 -1
- package/lib/util/mw-api.d.ts +7 -5
- package/lib/util/mw-api.js +167 -221
- package/lib/util/mw-api.js.map +1 -1
- package/lib/util/pageListMainPage.d.ts +3 -0
- package/lib/util/pageListMainPage.js +10 -0
- package/lib/util/pageListMainPage.js.map +1 -0
- package/lib/util/pages.d.ts +30 -0
- package/lib/util/pages.js +146 -0
- package/lib/util/pages.js.map +1 -0
- package/lib/util/rewriteUrls.d.ts +2 -2
- package/lib/util/rewriteUrls.js +33 -31
- package/lib/util/rewriteUrls.js.map +1 -1
- package/lib/util/savePages.d.ts +8 -0
- package/lib/util/savePages.js +182 -0
- package/lib/util/savePages.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/offliner-definition.json +178 -90
- package/package.json +50 -49
- package/res/page_list_home.js +20 -0
- package/res/{article_not_found.svg → page_not_found.svg} +1 -1
- package/res/script.js +30 -45
- package/res/style.css +52 -68
- package/res/templates/download_error_placeholder.html +7 -8
- package/res/templates/javaScript.html +19 -0
- package/res/templates/pageFallback.html +9 -7
- package/res/templates/pageVector2022.html +9 -7
- package/res/templates/pageVectorLegacy.html +9 -7
- package/res/templates/{article_list_home.html → page_list_home.html} +1 -2
- package/translation/ar.json +21 -21
- package/translation/bn.json +1 -1
- package/translation/de.json +46 -19
- package/translation/en.json +54 -21
- package/translation/es.json +17 -19
- package/translation/fi.json +23 -3
- package/translation/fr.json +57 -21
- package/translation/he.json +8 -6
- package/translation/ia.json +19 -19
- package/translation/id.json +13 -13
- package/translation/it.json +13 -8
- package/translation/ko.json +55 -3
- package/translation/lb.json +5 -2
- package/translation/mk.json +5 -5
- package/translation/nl.json +57 -22
- package/translation/or.json +2 -2
- package/translation/pt.json +2 -2
- package/translation/qqq.json +55 -22
- package/translation/ru.json +2 -2
- package/translation/sc.json +2 -2
- package/translation/sk.json +62 -0
- package/translation/sl.json +54 -21
- package/translation/sv.json +20 -19
- package/translation/sw.json +45 -2
- package/translation/zh-hans.json +56 -22
- package/translation/zh-hant.json +26 -19
- package/lib/renderers/abstractDesktop.render.d.ts +0 -12
- package/lib/renderers/abstractDesktop.render.js +0 -67
- package/lib/renderers/abstractDesktop.render.js.map +0 -1
- package/lib/renderers/abstractMobile.render.d.ts +0 -12
- package/lib/renderers/abstractMobile.render.js +0 -54
- package/lib/renderers/abstractMobile.render.js.map +0 -1
- package/lib/renderers/rest-api.renderer.d.ts +0 -7
- package/lib/renderers/rest-api.renderer.js +0 -68
- package/lib/renderers/rest-api.renderer.js.map +0 -1
- package/lib/renderers/visual-editor.renderer.d.ts +0 -7
- package/lib/renderers/visual-editor.renderer.js +0 -76
- package/lib/renderers/visual-editor.renderer.js.map +0 -1
- package/lib/renderers/wikimedia-desktop.renderer.d.ts +0 -4
- package/lib/renderers/wikimedia-desktop.renderer.js +0 -7
- package/lib/renderers/wikimedia-desktop.renderer.js.map +0 -1
- package/lib/renderers/wikimedia-mobile.renderer.d.ts +0 -19
- package/lib/renderers/wikimedia-mobile.renderer.js +0 -243
- package/lib/renderers/wikimedia-mobile.renderer.js.map +0 -1
- package/lib/util/articleListMainPage.d.ts +0 -3
- package/lib/util/articleListMainPage.js +0 -10
- package/lib/util/articleListMainPage.js.map +0 -1
- package/lib/util/articles.d.ts +0 -26
- package/lib/util/articles.js +0 -102
- package/lib/util/articles.js.map +0 -1
- package/lib/util/builders/url/desktop.director.d.ts +0 -8
- package/lib/util/builders/url/desktop.director.js +0 -15
- package/lib/util/builders/url/desktop.director.js.map +0 -1
- package/lib/util/builders/url/mobile.director.d.ts +0 -8
- package/lib/util/builders/url/mobile.director.js +0 -15
- package/lib/util/builders/url/mobile.director.js.map +0 -1
- package/lib/util/builders/url/rest-api.director.d.ts +0 -8
- package/lib/util/builders/url/rest-api.director.js +0 -18
- package/lib/util/builders/url/rest-api.director.js.map +0 -1
- package/lib/util/builders/url/visual-editor.director.d.ts +0 -9
- package/lib/util/builders/url/visual-editor.director.js +0 -18
- package/lib/util/builders/url/visual-editor.director.js.map +0 -1
- package/lib/util/saveArticles.d.ts +0 -8
- package/lib/util/saveArticles.js +0 -411
- package/lib/util/saveArticles.js.map +0 -1
- package/res/article_list_home.js +0 -24
- package/res/content.parsoid.css +0 -196
- package/res/inserted_style.css +0 -45
- package/res/templates/categories.html +0 -11
- package/res/templates/lead_section_wrapper.html +0 -6
- package/res/templates/pageWikimediaDesktop.html +0 -24
- package/res/templates/pageWikimediaMobile.html +0 -24
- package/res/templates/section_wrapper.html +0 -5
- package/res/templates/subcategories.html +0 -23
- package/res/templates/subpages.html +0 -17
- package/res/templates/subsection_wrapper.html +0 -5
- package/res/webpHandler.js +0 -165
- package/res/wm_mobile_override_script.js +0 -15
- package/res/wm_mobile_override_style.css +0 -20
- package/translation/br.json +0 -8
- package/translation/dag.json +0 -9
- package/translation/es-formal.json +0 -29
- package/translation/ha.json +0 -10
- package/translation/hi.json +0 -9
- package/translation/ig.json +0 -10
- package/translation/kaa.json +0 -9
- package/translation/nb.json +0 -9
- package/translation/nqo.json +0 -8
- package/translation/pt-br.json +0 -10
- package/translation/ro.json +0 -9
- package/translation/scn.json +0 -8
- package/translation/sq.json +0 -9
- package/translation/te.json +0 -9
- package/translation/tn.json +0 -9
- package/translation/tr.json +0 -10
package/lib/util/categories.js
CHANGED
|
@@ -1,185 +1,186 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
for (const cat of detail.categories || []) {
|
|
15
|
-
const catId = cat.title;
|
|
16
|
-
acc[catId] = (acc[catId] || []).concat({ title: detail.title, ns: detail.ns });
|
|
17
|
-
}
|
|
18
|
-
return acc;
|
|
19
|
-
}, {});
|
|
20
|
-
const foundCategoryIds = Object.keys(pagesXCategoryId);
|
|
21
|
-
if (foundCategoryIds.length) {
|
|
22
|
-
const existingArticles = await articleDetailXId.getMany(foundCategoryIds);
|
|
23
|
-
const categoriesToGet = Object.entries(existingArticles)
|
|
24
|
-
.filter(([, detail]) => !detail)
|
|
25
|
-
.map(([id]) => id);
|
|
26
|
-
if (categoriesToGet.length) {
|
|
27
|
-
await getArticlesByIds(categoriesToGet, false);
|
|
28
|
-
}
|
|
29
|
-
const catDetails = await articleDetailXId.getMany(foundCategoryIds);
|
|
30
|
-
for (const [id, detail] of Object.entries(catDetails)) {
|
|
31
|
-
if (!detail) {
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
const parentCategories = (detail.categories || []).reduce((acc, info) => {
|
|
35
|
-
acc[info.title] = info;
|
|
36
|
-
return acc;
|
|
37
|
-
}, {});
|
|
38
|
-
await nextCategoriesBatch.setMany(parentCategories);
|
|
39
|
-
detail.pages = (detail.pages || []).concat(pagesXCategoryId[id]);
|
|
40
|
-
await articleDetailXId.set(id, detail);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
if (deleteArticleStore) {
|
|
45
|
-
await articleStore.flush();
|
|
1
|
+
import MediaWiki from '../MediaWiki.js';
|
|
2
|
+
import { config } from '../config.js';
|
|
3
|
+
import { rewriteUrlsOfDoc } from './rewriteUrls.js';
|
|
4
|
+
import { getRelativeFilePath } from './misc.js';
|
|
5
|
+
export function buildCategoryMemberList(type, categoryMembers, categoryinfo, pageDetail, doc, dump, numericSorting, page, isLastPage, pagePath) {
|
|
6
|
+
let idName;
|
|
7
|
+
let headerContent;
|
|
8
|
+
let descText;
|
|
9
|
+
const pageName = pageDetail.title.split(':').slice(1).join(':');
|
|
10
|
+
if (type === 'subcats') {
|
|
11
|
+
idName = 'mw-subcategories';
|
|
12
|
+
headerContent = dump.t('subcategories');
|
|
13
|
+
descText = dump.t('categorySubcatCount', { curPageCount: categoryMembers.length, count: categoryinfo[type] });
|
|
46
14
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
15
|
+
else if (type === 'pages') {
|
|
16
|
+
idName = 'mw-pages';
|
|
17
|
+
headerContent = dump.t('categoryHeader', { pageName });
|
|
18
|
+
descText = dump.t('categoryPageCount', { curPageCount: categoryMembers.length, count: categoryinfo[type] });
|
|
50
19
|
}
|
|
51
|
-
else {
|
|
52
|
-
|
|
20
|
+
else if (type === 'files') {
|
|
21
|
+
idName = 'mw-category-media';
|
|
22
|
+
headerContent = dump.t('categoryMediaHeader', { pageName });
|
|
23
|
+
descText = dump.t('categoryFileCount', { curPageCount: categoryMembers.length, count: categoryinfo[type] });
|
|
53
24
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return acc;
|
|
79
|
-
}, {});
|
|
80
|
-
const subCategoryIds = Object.keys(subCategoriesXId);
|
|
81
|
-
const pagesXId = (articleDetail.pages || []).reduce((acc, c) => {
|
|
82
|
-
acc[c.title] = c;
|
|
83
|
-
return acc;
|
|
84
|
-
}, {});
|
|
85
|
-
const pageIds = Object.keys(pagesXId);
|
|
86
|
-
const [categoriesExist, subCategoriesExist, pagesExist] = await Promise.all([
|
|
87
|
-
categoryIds.length ? articleDetailXId.existsMany(categoryIds, true) : Promise.resolve({}),
|
|
88
|
-
subCategoryIds.length ? articleDetailXId.existsMany(subCategoryIds, true) : Promise.resolve({}),
|
|
89
|
-
pageIds.length ? articleDetailXId.existsMany(pageIds, true) : Promise.resolve({}),
|
|
90
|
-
]);
|
|
91
|
-
const existingCategories = Object.keys(categoriesExist).filter((key) => categoriesExist[key]);
|
|
92
|
-
const existingSubCategories = Object.keys(subCategoriesExist).filter((key) => subCategoriesExist[key]);
|
|
93
|
-
const existingPages = Object.keys(pagesExist).filter((key) => pagesExist[key]);
|
|
94
|
-
let hasUpdated = false;
|
|
95
|
-
const newCategoryKeys = deDup(existingCategories || [], (p) => p);
|
|
96
|
-
const newCategories = newCategoryKeys.map((key) => categoriesXId[key]);
|
|
97
|
-
if (newCategories.length !== categoryIds.length) {
|
|
98
|
-
articleDetail.categories = newCategories;
|
|
99
|
-
hasUpdated = true;
|
|
25
|
+
const section = doc.createElement('div');
|
|
26
|
+
section.id = idName;
|
|
27
|
+
const header = doc.createElement('h2');
|
|
28
|
+
header.textContent = headerContent;
|
|
29
|
+
section.appendChild(header);
|
|
30
|
+
const desc = doc.createElement('p');
|
|
31
|
+
desc.textContent = descText;
|
|
32
|
+
section.appendChild(desc);
|
|
33
|
+
const content = doc.createElement('div');
|
|
34
|
+
content.lang = pageDetail.pagelang;
|
|
35
|
+
content.dir = pageDetail.pagedir;
|
|
36
|
+
content.classList.add('mw-content-' + pageDetail.pagedir);
|
|
37
|
+
const columns = doc.createElement('div');
|
|
38
|
+
columns.classList.add('mw-category');
|
|
39
|
+
if (categoryMembers.length > 6)
|
|
40
|
+
columns.classList.add('mw-category-columns');
|
|
41
|
+
let lastPrefix, column, list;
|
|
42
|
+
for (const categoryMember of categoryMembers) {
|
|
43
|
+
const sortkeyPrefix = numericSorting && /^\d/.test(categoryMember.sortkeyprefix) ? dump.t('categoryHeaderNumerals') : categoryMember.sortkeyprefix;
|
|
44
|
+
if (lastPrefix !== sortkeyPrefix) {
|
|
45
|
+
lastPrefix = sortkeyPrefix;
|
|
46
|
+
if (column) {
|
|
47
|
+
column.appendChild(list);
|
|
48
|
+
columns.appendChild(column);
|
|
100
49
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (newPages.length !== pageIds.length) {
|
|
110
|
-
articleDetail.pages = newPages;
|
|
111
|
-
hasUpdated = true;
|
|
112
|
-
}
|
|
113
|
-
if (hasUpdated) {
|
|
114
|
-
await articleDetailXId.set(articleId, articleDetail);
|
|
115
|
-
modifiedArticles += 1;
|
|
116
|
-
}
|
|
117
|
-
if (processedArticles % 100 === 0) {
|
|
118
|
-
const percentProgress = Math.floor((processedArticles / numKeys) * 1000) / 10;
|
|
119
|
-
if (percentProgress !== prevPercentProgress) {
|
|
120
|
-
prevPercentProgress = percentProgress;
|
|
121
|
-
logger.log(`Progress trimming un-mirrored articles [${processedArticles}/${numKeys}] [${percentProgress}%]`);
|
|
122
|
-
}
|
|
50
|
+
column = doc.createElement('div');
|
|
51
|
+
column.classList.add('mw-category-group');
|
|
52
|
+
const groupHeader = doc.createElement('h3');
|
|
53
|
+
groupHeader.textContent = sortkeyPrefix === ' ' ? ' ' : sortkeyPrefix;
|
|
54
|
+
column.appendChild(groupHeader);
|
|
55
|
+
list = doc.createElement('ul');
|
|
56
|
+
if (type === 'files' && !categoryinfo.nogallery) {
|
|
57
|
+
list.classList.add('gallery', 'mw-gallery-traditional');
|
|
123
58
|
}
|
|
124
59
|
}
|
|
125
|
-
|
|
126
|
-
|
|
60
|
+
if (type === 'files' && !categoryinfo.nogallery) {
|
|
61
|
+
const pageName = categoryMember.title.split(':').slice(1).join(':');
|
|
62
|
+
const member = doc.createElement('li');
|
|
63
|
+
member.classList.add('gallerybox');
|
|
64
|
+
member.setAttribute('style', 'width: 155px');
|
|
65
|
+
const thumb = doc.createElement('div');
|
|
66
|
+
thumb.classList.add('thumb');
|
|
67
|
+
thumb.setAttribute('style', 'width: 150px; height: 150px;');
|
|
68
|
+
const span = doc.createElement('span');
|
|
69
|
+
span.setAttribute('typeof', 'mw:File');
|
|
70
|
+
const filelink = doc.createElement('a');
|
|
71
|
+
filelink.target = '_parent';
|
|
72
|
+
filelink.classList.add('mw-file-description');
|
|
73
|
+
filelink.setAttribute('href', MediaWiki.webUrl.pathname + encodeURIComponent(categoryMember.title.replace(/ /g, '_')));
|
|
74
|
+
const file = doc.createElement('img');
|
|
75
|
+
file.classList.add('mw-file-description');
|
|
76
|
+
// Special:Filepath work-around for file redirects
|
|
77
|
+
file.setAttribute('src', MediaWiki.webUrl.pathname + encodeURIComponent(`Special:Filepath/${encodeURIComponent(pageName)}?width=120`));
|
|
78
|
+
file.setAttribute('style', 'width: auto; height: auto; max-width: 120px; max-height: 120px;');
|
|
79
|
+
file.setAttribute('width', '120');
|
|
80
|
+
file.setAttribute('height', '120');
|
|
81
|
+
file.setAttribute('decoding', 'async');
|
|
82
|
+
file.setAttribute('loading', 'lazy');
|
|
83
|
+
filelink.appendChild(file);
|
|
84
|
+
span.appendChild(filelink);
|
|
85
|
+
thumb.appendChild(span);
|
|
86
|
+
member.appendChild(thumb);
|
|
87
|
+
const text = doc.createElement('div');
|
|
88
|
+
text.classList.add('gallerytext');
|
|
89
|
+
const link = doc.createElement('a');
|
|
90
|
+
link.target = '_parent';
|
|
91
|
+
link.classList.add('galleryfilename', 'galleryfilename-truncate');
|
|
92
|
+
link.setAttribute('href', MediaWiki.webUrl.pathname + encodeURIComponent(categoryMember.title.replace(/ /g, '_')));
|
|
93
|
+
link.setAttribute('title', categoryMember.title);
|
|
94
|
+
link.textContent = pageName;
|
|
95
|
+
text.appendChild(link);
|
|
96
|
+
member.appendChild(text);
|
|
97
|
+
list.appendChild(member);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const member = doc.createElement('li');
|
|
101
|
+
const link = doc.createElement('a');
|
|
102
|
+
link.target = '_parent';
|
|
103
|
+
link.setAttribute('href', MediaWiki.webUrl.pathname + encodeURIComponent(categoryMember.title.replace(/ /g, '_')));
|
|
104
|
+
link.setAttribute('title', categoryMember.title);
|
|
105
|
+
link.textContent = type === 'subcats' ? categoryMember.title.split(':').slice(1).join(':') : categoryMember.title;
|
|
106
|
+
member.appendChild(link);
|
|
107
|
+
list.appendChild(member);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (column) {
|
|
111
|
+
column.appendChild(list);
|
|
112
|
+
columns.appendChild(column);
|
|
113
|
+
}
|
|
114
|
+
content.appendChild(columns);
|
|
115
|
+
section.appendChild(buildPaginationDiv(doc, page, isLastPage, pagePath, type, idName, dump));
|
|
116
|
+
section.appendChild(content);
|
|
117
|
+
section.appendChild(buildPaginationDiv(doc, page, isLastPage, pagePath, type, idName, dump));
|
|
118
|
+
return section;
|
|
127
119
|
}
|
|
128
|
-
export async function
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
let
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const shouldRemoveNode = subArticles.length <= 3;
|
|
143
|
-
if (shouldRemoveNode) {
|
|
144
|
-
// Update sub pages
|
|
145
|
-
// Add parent categories to child pages
|
|
146
|
-
const hasPages = articleDetail.pages && articleDetail.pages.length;
|
|
147
|
-
const scrapedPages = hasPages ? await articleDetailXId.getMany(articleDetail.pages.map((p) => p.title)) : {};
|
|
148
|
-
for (const [pageId, pageDetail] of Object.entries(scrapedPages)) {
|
|
149
|
-
if (pageDetail) {
|
|
150
|
-
pageDetail.categories = (pageDetail.categories || [])
|
|
151
|
-
.filter((c) => c && c.title !== articleDetail.title) // remove self
|
|
152
|
-
.concat(articleDetail.categories || []); // add parent categories
|
|
153
|
-
pageDetail.categories = deDup(pageDetail.categories, (o) => o.title);
|
|
154
|
-
await articleDetailXId.set(pageId, pageDetail);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// Update parent categories
|
|
158
|
-
// Add children to parent categories
|
|
159
|
-
const hasCategories = articleDetail.categories && articleDetail.categories.length;
|
|
160
|
-
const scrapedCategories = hasCategories ? await articleDetailXId.getMany(articleDetail.categories.map((p) => p.title)) : {};
|
|
161
|
-
for (const [catId, catDetail] of Object.entries(scrapedCategories)) {
|
|
162
|
-
if (catDetail) {
|
|
163
|
-
const categoryDetail = Object.assign({ pages: [], subCategories: [] }, catDetail || {});
|
|
164
|
-
categoryDetail.pages = categoryDetail.pages.concat(articleDetail.pages);
|
|
165
|
-
categoryDetail.subCategories = categoryDetail.subCategories.concat(articleDetail.subCategories).filter((c) => c.title === articleDetail.title);
|
|
166
|
-
categoryDetail.pages = deDup(categoryDetail.pages, (o) => o.title);
|
|
167
|
-
categoryDetail.subCategories = deDup(categoryDetail.subCategories, (o) => o.title);
|
|
168
|
-
await articleDetailXId.set(catId, categoryDetail);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
await articleDetailXId.delete(articleId);
|
|
172
|
-
deletedNodes += 1;
|
|
173
|
-
}
|
|
120
|
+
export async function buildCategoryTypeItems(type, categoryinfo, categoryMembers, pagePath, pageDetail, doc, dump, numericSorting, moduleDependencies, pageTitle, categoryContent, pageItems) {
|
|
121
|
+
if (!categoryinfo[type])
|
|
122
|
+
return;
|
|
123
|
+
if (type === 'files' && !categoryinfo.nogallery) {
|
|
124
|
+
moduleDependencies.styleDependenciesList.push('mediawiki.page.gallery.styles');
|
|
125
|
+
}
|
|
126
|
+
let page = 1;
|
|
127
|
+
for (let start = 0; start < categoryinfo[type]; start += MediaWiki.categoriesPageSize) {
|
|
128
|
+
const end = Math.min(start + MediaWiki.categoriesPageSize, categoryinfo[type]);
|
|
129
|
+
const isLastPage = end >= categoryinfo[type];
|
|
130
|
+
const section = buildCategoryMemberList(type, categoryMembers[type].slice(start, end), categoryinfo, pageDetail, doc, dump, numericSorting, page, isLastPage, pagePath);
|
|
131
|
+
if (page === 1) {
|
|
132
|
+
// Append section directly to page itself if on first page so that noJS works fine
|
|
133
|
+
categoryContent.appendChild(section);
|
|
174
134
|
}
|
|
175
|
-
if (
|
|
176
|
-
|
|
177
|
-
if
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
135
|
+
if (!(page == 1 && isLastPage)) {
|
|
136
|
+
// Save section in subdoc so that JS can load it (including first page so we can move back to it)
|
|
137
|
+
// No need to do it if we have only one page, everything will be directly in the page
|
|
138
|
+
const partialZimPath = `${config.output.dirs.categories_partials}${pagePath}_${type}_${page}`;
|
|
139
|
+
// Create a copy so we can alter it without altering current page content
|
|
140
|
+
const partial = doc.createElement('div');
|
|
141
|
+
partial.innerHTML = section.outerHTML;
|
|
142
|
+
// Rewrite URLs in partial
|
|
143
|
+
await rewriteUrlsOfDoc(partial, partialZimPath, dump);
|
|
144
|
+
pageItems.push({
|
|
145
|
+
pageTitle: pageTitle,
|
|
146
|
+
zimPath: partialZimPath,
|
|
147
|
+
zimTitle: '',
|
|
148
|
+
htmlContent: partial.innerHTML,
|
|
149
|
+
});
|
|
181
150
|
}
|
|
182
|
-
|
|
183
|
-
|
|
151
|
+
page++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function buildPaginationLink(doc, targetPage, text, idName, partialUrl) {
|
|
155
|
+
const link = doc.createElement('a');
|
|
156
|
+
const url = `${partialUrl}_${targetPage}`;
|
|
157
|
+
link.setAttribute('onclick', `displayCategoryPartial('${idName}', '${url}')`);
|
|
158
|
+
link.setAttribute('tabindex', '0');
|
|
159
|
+
link.setAttribute('onkeydown', `if(event.key==='Enter') displayCategoryPartial('${idName}', '${url}')`);
|
|
160
|
+
link.textContent = text;
|
|
161
|
+
link.classList.add('mwo-norewrite');
|
|
162
|
+
return link;
|
|
163
|
+
}
|
|
164
|
+
function buildPaginationDiv(doc, page, isLastPage, pathPath, type, idName, dump) {
|
|
165
|
+
const section = doc.createElement('div');
|
|
166
|
+
section.classList.add('mwo-cat-pagination');
|
|
167
|
+
const spanNoJS = doc.createElement('span');
|
|
168
|
+
spanNoJS.classList.add('mwo-no-js');
|
|
169
|
+
spanNoJS.textContent = dump.t('categoryNoPagination');
|
|
170
|
+
section.appendChild(spanNoJS);
|
|
171
|
+
const partialUrl = getRelativeFilePath(pathPath, `${config.output.dirs.categories_partials}${pathPath}_${type}`);
|
|
172
|
+
const spanWithJS = doc.createElement('span');
|
|
173
|
+
spanWithJS.classList.add('mwo-js');
|
|
174
|
+
if (!(page == 1 && isLastPage)) {
|
|
175
|
+
const fragment = doc.createDocumentFragment();
|
|
176
|
+
fragment.appendChild(doc.createTextNode('('));
|
|
177
|
+
fragment.appendChild(page == 1 ? doc.createTextNode(dump.t('categoryPreviousPage')) : buildPaginationLink(doc, page - 1, dump.t('categoryPreviousPage'), idName, partialUrl));
|
|
178
|
+
fragment.appendChild(doc.createTextNode(') ('));
|
|
179
|
+
fragment.appendChild(isLastPage ? doc.createTextNode(dump.t('categoryNextPage')) : buildPaginationLink(doc, page + 1, dump.t('categoryNextPage'), idName, partialUrl));
|
|
180
|
+
fragment.appendChild(doc.createTextNode(')'));
|
|
181
|
+
spanWithJS.appendChild(fragment);
|
|
182
|
+
}
|
|
183
|
+
section.appendChild(spanWithJS);
|
|
184
|
+
return section;
|
|
184
185
|
}
|
|
185
186
|
//# sourceMappingURL=categories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/util/categories.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/util/categories.ts"],"names":[],"mappings":"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"}
|
package/lib/util/const.d.ts
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const PAGE_REQUEST_INTERVAL = 100;
|
|
2
2
|
export declare const IMAGE_THUMB_URL_REGEX: RegExp;
|
|
3
3
|
export declare const LATEX_IMAGE_URL_REGEX: RegExp;
|
|
4
4
|
export declare const FANDOM_IMAGE_URL_REGEX: RegExp;
|
|
5
|
-
export declare const
|
|
5
|
+
export declare const MIN_IMAGE_THRESHOLD_INDEX_PAGE = 10;
|
|
6
6
|
export declare const IMAGE_MIME_REGEX: RegExp;
|
|
7
7
|
export declare const FIND_HTTP_REGEX: RegExp;
|
|
8
8
|
export declare const DB_ERROR = "internal_api_error_DBQueryError";
|
|
9
|
-
export declare const
|
|
9
|
+
export declare const DELETED_PAGE_ERROR = "Page has been deleted.";
|
|
10
10
|
export declare const WEAK_ETAG_REGEX: RegExp;
|
|
11
11
|
export declare const BITMAP_IMAGE_MIME_REGEX: RegExp;
|
|
12
12
|
export declare const WEBP_CANDIDATE_IMAGE_MIME_TYPE: RegExp;
|
|
13
|
-
export declare const ALL_READY_FUNCTION: RegExp;
|
|
14
|
-
export declare const DO_PROPAGATION: RegExp;
|
|
15
|
-
export declare const LOAD_PHP: RegExp;
|
|
16
13
|
export declare const RULE_TO_REDIRECT: RegExp;
|
|
17
14
|
export declare const MAX_FILE_DOWNLOAD_RETRIES = 5;
|
|
18
15
|
export declare const FILES_DOWNLOAD_FAILURE_MINIMUM_FOR_CHECK = 50;
|
|
19
16
|
export declare const FILES_DOWNLOAD_FAILURE_TRESHOLD_PER_TEN_THOUSAND = 10;
|
|
20
17
|
export declare const BLACKLISTED_NS: string[];
|
|
21
18
|
export declare const RENDERERS_LIST: string[];
|
|
22
|
-
export declare const
|
|
23
|
-
export declare const REDIRECT_PAGE_SIGNATURE = "Moved to";
|
|
19
|
+
export declare const CATEGORIES_PAGE_SIZE = 200;
|
package/lib/util/const.js
CHANGED
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
export const
|
|
2
|
-
export const IMAGE_THUMB_URL_REGEX = /^(.*?\/)(transcoded\/|thumb\/)?([0-9a-fA-F]{1}\/[0-9a-fA-F]{2}\/)?([^/]+\.[A-Za-z0-9]{2,6}\/)?(\d+px[-]+)?([^/]+?\.[A-Za-z0-9]{2,6}(\.[A-Za-z0-9]{2,6})?)(\?[0-9a-fA-F]
|
|
1
|
+
export const PAGE_REQUEST_INTERVAL = 100; // default pause (ms) between action=parse API requests per worker
|
|
2
|
+
export const IMAGE_THUMB_URL_REGEX = /^(.*?\/)(transcoded\/|thumb\/)?([0-9a-fA-F]{1}\/[0-9a-fA-F]{2}\/)?([^/]+\.[A-Za-z0-9]{2,6}\/)?(\d+px[-]+)?([^/]+?\.[A-Za-z0-9]{2,6}(\.[A-Za-z0-9]{2,6})?)(\?[0-9a-fA-F]+|\?utm_.+)?$/;
|
|
3
3
|
export const LATEX_IMAGE_URL_REGEX = /^(.*\/math\/render\/svg\/)([A-Za-z0-9]+)$/;
|
|
4
4
|
export const FANDOM_IMAGE_URL_REGEX = /^(.*\/)[0-9a-fA-F]{1}\/[0-9a-fA-F]{2}\/([^/]+)\/revision\//i;
|
|
5
|
-
export const
|
|
5
|
+
export const MIN_IMAGE_THRESHOLD_INDEX_PAGE = 10;
|
|
6
6
|
export const IMAGE_MIME_REGEX = /^image+[/-\w.]+$/;
|
|
7
7
|
export const FIND_HTTP_REGEX = /^(?:https?:\/\/)?/i;
|
|
8
8
|
export const DB_ERROR = 'internal_api_error_DBQueryError';
|
|
9
|
-
export const
|
|
9
|
+
export const DELETED_PAGE_ERROR = 'Page has been deleted.';
|
|
10
10
|
export const WEAK_ETAG_REGEX = /^(W\/)/;
|
|
11
|
-
export const BITMAP_IMAGE_MIME_REGEX = /^image+[/-\w.]+(jpeg|png|gif)$/;
|
|
12
|
-
export const WEBP_CANDIDATE_IMAGE_MIME_TYPE = /image+[/]+(jpeg|png)/;
|
|
13
|
-
export const
|
|
14
|
-
export const DO_PROPAGATION = /mw\.requestIdleCallback\( doPropagation, \{ timeout: 1 \} \);/;
|
|
15
|
-
export const LOAD_PHP = /script.src = ".*load\.php.*";/;
|
|
16
|
-
export const RULE_TO_REDIRECT = /window\.top !== window\.self/;
|
|
11
|
+
export const BITMAP_IMAGE_MIME_REGEX = /^image+[/-\w.]+(jpeg|png|apng|gif)$/;
|
|
12
|
+
export const WEBP_CANDIDATE_IMAGE_MIME_TYPE = /image+[/]+(jpeg|png|apng|gif)/;
|
|
13
|
+
export const RULE_TO_REDIRECT = /window\.top!==window\.self/;
|
|
17
14
|
export const MAX_FILE_DOWNLOAD_RETRIES = 5;
|
|
18
15
|
export const FILES_DOWNLOAD_FAILURE_MINIMUM_FOR_CHECK = 50; // minimum number of files failing download before starting to consider for failing the scrape
|
|
19
16
|
export const FILES_DOWNLOAD_FAILURE_TRESHOLD_PER_TEN_THOUSAND = 10; // 10 = 0.1%
|
|
20
17
|
export const BLACKLISTED_NS = ['Story']; // 'Story' Wikipedia namespace is content, but not indgestable by Parsoid https://github.com/openzim/mwoffliner/issues/1853
|
|
21
|
-
export const RENDERERS_LIST = ['
|
|
22
|
-
export const
|
|
23
|
-
/*
|
|
24
|
-
Handle redirection pages for 3rd party wikis that have 200 response code
|
|
25
|
-
Check this link: https://pokemon.fandom.com/w/api.php?action=visualeditor&mobileformat=html&format=json&paction=parse&formatversion=2&page=MediaWiki%3ASidebar
|
|
26
|
-
*/
|
|
27
|
-
export const REDIRECT_PAGE_SIGNATURE = 'Moved to';
|
|
18
|
+
export const RENDERERS_LIST = ['ActionParse'];
|
|
19
|
+
export const CATEGORIES_PAGE_SIZE = 200;
|
|
28
20
|
//# sourceMappingURL=const.js.map
|
package/lib/util/const.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/util/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/util/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAA,CAAC,kEAAkE;AAC3G,MAAM,CAAC,MAAM,qBAAqB,GAChC,sLAAsL,CAAA;AACxL,MAAM,CAAC,MAAM,qBAAqB,GAAG,2CAA2C,CAAA;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,6DAA6D,CAAA;AACnG,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAA;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAA;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAA;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,iCAAiC,CAAA;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AACvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,qCAAqC,CAAA;AAC5E,MAAM,CAAC,MAAM,8BAA8B,GAAG,+BAA+B,CAAA;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAA;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAC1C,MAAM,CAAC,MAAM,wCAAwC,GAAG,EAAE,CAAA,CAAC,8FAA8F;AACzJ,MAAM,CAAC,MAAM,gDAAgD,GAAG,EAAE,CAAA,CAAC,YAAY;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,CAAA,CAAC,2HAA2H;AACnK,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,aAAa,CAAC,CAAA;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function parseCustomJsUrls(rawValue: string): string[];
|
|
2
|
+
export declare function parseCustomCssUrls(rawValue: string): string[];
|
|
3
|
+
export declare function parseCustomUrls(rawValue: string, kind: string, cliParameter: string): string[];
|
|
4
|
+
export declare function customJsUrlToFilename(url: string): string;
|
|
5
|
+
export declare function customCssUrlToFilename(url: string): string;
|
|
6
|
+
export declare function customUrlToFilename(url: string, default_path: string, filename_regex: RegExp, filename_suffix: string): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import crypto from 'crypto';
|
|
3
|
+
export function parseCustomJsUrls(rawValue) {
|
|
4
|
+
return parseCustomUrls(rawValue, 'JS', '--customJs');
|
|
5
|
+
}
|
|
6
|
+
export function parseCustomCssUrls(rawValue) {
|
|
7
|
+
return parseCustomUrls(rawValue, 'CSS', '--customCss');
|
|
8
|
+
}
|
|
9
|
+
export function parseCustomUrls(rawValue, kind, cliParameter) {
|
|
10
|
+
if (!rawValue) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const result = [];
|
|
14
|
+
const errors = [];
|
|
15
|
+
const parts = String(rawValue)
|
|
16
|
+
.split(',')
|
|
17
|
+
.filter((n) => n)
|
|
18
|
+
.map((part) => {
|
|
19
|
+
let item = part.trim();
|
|
20
|
+
if (fs.existsSync(item)) {
|
|
21
|
+
item = fs
|
|
22
|
+
.readFileSync(item, 'utf-8')
|
|
23
|
+
.split(/[\n,]/)
|
|
24
|
+
.map((a) => a.replace(/\r/gm, '').trim())
|
|
25
|
+
.filter((a) => a);
|
|
26
|
+
}
|
|
27
|
+
return item;
|
|
28
|
+
})
|
|
29
|
+
.flat(1);
|
|
30
|
+
for (const part of parts) {
|
|
31
|
+
const trimmed = part.trim();
|
|
32
|
+
if (!trimmed) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const url = new URL(trimmed);
|
|
37
|
+
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
38
|
+
errors.push(`Invalid ${kind} URL [${trimmed}]: unsupported protocol [${url.protocol}]`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
errors.push(`Invalid ${kind} URL [${trimmed}]: not a valid URL`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (result.includes(trimmed)) {
|
|
47
|
+
errors.push(`Duplicate ${kind} URL [${trimmed}]`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
result.push(trimmed);
|
|
51
|
+
}
|
|
52
|
+
if (errors.length > 0) {
|
|
53
|
+
throw new Error(`${cliParameter} has invalid entries:\n${errors.map((e) => ` - ${e}`).join('\n')}`);
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
export function customJsUrlToFilename(url) {
|
|
58
|
+
return customUrlToFilename(url, 'custom_script', /\.js$/, '.js');
|
|
59
|
+
}
|
|
60
|
+
export function customCssUrlToFilename(url) {
|
|
61
|
+
return customUrlToFilename(url, 'custom_style', /\.css$/, '.css');
|
|
62
|
+
}
|
|
63
|
+
export function customUrlToFilename(url, default_path, filename_regex, filename_suffix) {
|
|
64
|
+
const pathname = new URL(url).pathname;
|
|
65
|
+
const basename = pathname.split('/').pop() || default_path;
|
|
66
|
+
const stem = basename.replace(filename_regex, '').replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
67
|
+
const hash = crypto.createHash('md5').update(url).digest('hex').slice(0, 8);
|
|
68
|
+
return `${hash}_${stem}${filename_suffix}`;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=customCssJs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customCssJs.js","sourceRoot":"","sources":["../../src/util/customCssJs.ts"],"names":[],"mappings":"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"}
|