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.
Files changed (227) hide show
  1. package/README.md +355 -62
  2. package/docs/functional_architecture.md +34 -38
  3. package/extensions/wiktionary_fr.js +18 -17
  4. package/jest.config.cjs +2 -2
  5. package/lib/DOMUtils.js +0 -1
  6. package/lib/DOMUtils.js.map +1 -1
  7. package/lib/Downloader.d.ts +39 -31
  8. package/lib/Downloader.js +418 -349
  9. package/lib/Downloader.js.map +1 -1
  10. package/lib/Dump.d.ts +24 -10
  11. package/lib/Dump.js +95 -50
  12. package/lib/Dump.js.map +1 -1
  13. package/lib/Gadgets.d.ts +2 -1
  14. package/lib/Gadgets.js +7 -5
  15. package/lib/Gadgets.js.map +1 -1
  16. package/lib/Logger.d.ts +6 -6
  17. package/lib/Logger.js +33 -33
  18. package/lib/Logger.js.map +1 -1
  19. package/lib/MediaWiki.d.ts +14 -31
  20. package/lib/MediaWiki.js +119 -172
  21. package/lib/MediaWiki.js.map +1 -1
  22. package/lib/RedisStore.d.ts +3 -3
  23. package/lib/RedisStore.js +21 -23
  24. package/lib/RedisStore.js.map +1 -1
  25. package/lib/S3.js +1 -1
  26. package/lib/S3.js.map +1 -1
  27. package/lib/Templates.d.ts +3 -10
  28. package/lib/Templates.js +5 -14
  29. package/lib/Templates.js.map +1 -1
  30. package/lib/cli.js +7 -6
  31. package/lib/cli.js.map +1 -1
  32. package/lib/config.d.ts +10 -16
  33. package/lib/config.js +33 -55
  34. package/lib/config.js.map +1 -1
  35. package/lib/error.manager.d.ts +2 -2
  36. package/lib/error.manager.js +42 -49
  37. package/lib/error.manager.js.map +1 -1
  38. package/lib/i18n.d.ts +2 -0
  39. package/lib/i18n.js +53 -0
  40. package/lib/i18n.js.map +1 -0
  41. package/lib/mutex.d.ts +2 -1
  42. package/lib/mutex.js +2 -1
  43. package/lib/mutex.js.map +1 -1
  44. package/lib/mwoffliner.lib.js +370 -222
  45. package/lib/mwoffliner.lib.js.map +1 -1
  46. package/lib/parameterList.d.ts +20 -8
  47. package/lib/parameterList.js +30 -18
  48. package/lib/parameterList.js.map +1 -1
  49. package/lib/renderers/abstract.renderer.d.ts +48 -55
  50. package/lib/renderers/abstract.renderer.js +377 -98
  51. package/lib/renderers/abstract.renderer.js.map +1 -1
  52. package/lib/renderers/action-parse.renderer.d.ts +22 -3
  53. package/lib/renderers/action-parse.renderer.js +123 -81
  54. package/lib/renderers/action-parse.renderer.js.map +1 -1
  55. package/lib/renderers/renderer.builder.js +6 -69
  56. package/lib/renderers/renderer.builder.js.map +1 -1
  57. package/lib/renderers/rendering.context.d.ts +2 -3
  58. package/lib/renderers/rendering.context.js +6 -14
  59. package/lib/renderers/rendering.context.js.map +1 -1
  60. package/lib/sanitize-argument.d.ts +7 -4
  61. package/lib/sanitize-argument.js +99 -41
  62. package/lib/sanitize-argument.js.map +1 -1
  63. package/lib/util/FileManager.d.ts +36 -0
  64. package/lib/util/FileManager.js +246 -0
  65. package/lib/util/FileManager.js.map +1 -0
  66. package/lib/util/RedisKvs.js +4 -4
  67. package/lib/util/RedisKvs.js.map +1 -1
  68. package/lib/util/RedisQueue.js +1 -1
  69. package/lib/util/RedisQueue.js.map +1 -1
  70. package/lib/util/builders/url/action-parse.director.d.ts +2 -2
  71. package/lib/util/builders/url/action-parse.director.js +7 -7
  72. package/lib/util/builders/url/action-parse.director.js.map +1 -1
  73. package/lib/util/builders/url/api.director.d.ts +2 -4
  74. package/lib/util/builders/url/api.director.js +10 -17
  75. package/lib/util/builders/url/api.director.js.map +1 -1
  76. package/lib/util/builders/url/base.director.d.ts +0 -4
  77. package/lib/util/builders/url/base.director.js +0 -25
  78. package/lib/util/builders/url/base.director.js.map +1 -1
  79. package/lib/util/builders/url/basic.director.d.ts +1 -1
  80. package/lib/util/builders/url/basic.director.js +1 -1
  81. package/lib/util/builders/url/web.director.d.ts +1 -1
  82. package/lib/util/builders/url/web.director.js +2 -2
  83. package/lib/util/builders/url/web.director.js.map +1 -1
  84. package/lib/util/categories.d.ts +5 -5
  85. package/lib/util/categories.js +175 -174
  86. package/lib/util/categories.js.map +1 -1
  87. package/lib/util/const.d.ts +4 -8
  88. package/lib/util/const.js +9 -17
  89. package/lib/util/const.js.map +1 -1
  90. package/lib/util/customCssJs.d.ts +6 -0
  91. package/lib/util/customCssJs.js +70 -0
  92. package/lib/util/customCssJs.js.map +1 -0
  93. package/lib/util/dump.d.ts +15 -4
  94. package/lib/util/dump.js +282 -86
  95. package/lib/util/dump.js.map +1 -1
  96. package/lib/util/index.d.ts +1 -1
  97. package/lib/util/index.js +1 -1
  98. package/lib/util/index.js.map +1 -1
  99. package/lib/util/metaData.js.map +1 -1
  100. package/lib/util/misc.d.ts +23 -13
  101. package/lib/util/misc.js +90 -59
  102. package/lib/util/misc.js.map +1 -1
  103. package/lib/util/mw-api.d.ts +7 -5
  104. package/lib/util/mw-api.js +167 -221
  105. package/lib/util/mw-api.js.map +1 -1
  106. package/lib/util/pageListMainPage.d.ts +3 -0
  107. package/lib/util/pageListMainPage.js +10 -0
  108. package/lib/util/pageListMainPage.js.map +1 -0
  109. package/lib/util/pages.d.ts +30 -0
  110. package/lib/util/pages.js +146 -0
  111. package/lib/util/pages.js.map +1 -0
  112. package/lib/util/rewriteUrls.d.ts +2 -2
  113. package/lib/util/rewriteUrls.js +33 -31
  114. package/lib/util/rewriteUrls.js.map +1 -1
  115. package/lib/util/savePages.d.ts +8 -0
  116. package/lib/util/savePages.js +182 -0
  117. package/lib/util/savePages.js.map +1 -0
  118. package/lib/version.d.ts +1 -1
  119. package/lib/version.js +1 -1
  120. package/lib/version.js.map +1 -1
  121. package/offliner-definition.json +178 -90
  122. package/package.json +50 -49
  123. package/res/page_list_home.js +20 -0
  124. package/res/{article_not_found.svg → page_not_found.svg} +1 -1
  125. package/res/script.js +30 -45
  126. package/res/style.css +52 -68
  127. package/res/templates/download_error_placeholder.html +7 -8
  128. package/res/templates/javaScript.html +19 -0
  129. package/res/templates/pageFallback.html +9 -7
  130. package/res/templates/pageVector2022.html +9 -7
  131. package/res/templates/pageVectorLegacy.html +9 -7
  132. package/res/templates/{article_list_home.html → page_list_home.html} +1 -2
  133. package/translation/ar.json +21 -21
  134. package/translation/bn.json +1 -1
  135. package/translation/de.json +46 -19
  136. package/translation/en.json +54 -21
  137. package/translation/es.json +17 -19
  138. package/translation/fi.json +23 -3
  139. package/translation/fr.json +57 -21
  140. package/translation/he.json +8 -6
  141. package/translation/ia.json +19 -19
  142. package/translation/id.json +13 -13
  143. package/translation/it.json +13 -8
  144. package/translation/ko.json +55 -3
  145. package/translation/lb.json +5 -2
  146. package/translation/mk.json +5 -5
  147. package/translation/nl.json +57 -22
  148. package/translation/or.json +2 -2
  149. package/translation/pt.json +2 -2
  150. package/translation/qqq.json +55 -22
  151. package/translation/ru.json +2 -2
  152. package/translation/sc.json +2 -2
  153. package/translation/sk.json +62 -0
  154. package/translation/sl.json +54 -21
  155. package/translation/sv.json +20 -19
  156. package/translation/sw.json +45 -2
  157. package/translation/zh-hans.json +56 -22
  158. package/translation/zh-hant.json +26 -19
  159. package/lib/renderers/abstractDesktop.render.d.ts +0 -12
  160. package/lib/renderers/abstractDesktop.render.js +0 -67
  161. package/lib/renderers/abstractDesktop.render.js.map +0 -1
  162. package/lib/renderers/abstractMobile.render.d.ts +0 -12
  163. package/lib/renderers/abstractMobile.render.js +0 -54
  164. package/lib/renderers/abstractMobile.render.js.map +0 -1
  165. package/lib/renderers/rest-api.renderer.d.ts +0 -7
  166. package/lib/renderers/rest-api.renderer.js +0 -68
  167. package/lib/renderers/rest-api.renderer.js.map +0 -1
  168. package/lib/renderers/visual-editor.renderer.d.ts +0 -7
  169. package/lib/renderers/visual-editor.renderer.js +0 -76
  170. package/lib/renderers/visual-editor.renderer.js.map +0 -1
  171. package/lib/renderers/wikimedia-desktop.renderer.d.ts +0 -4
  172. package/lib/renderers/wikimedia-desktop.renderer.js +0 -7
  173. package/lib/renderers/wikimedia-desktop.renderer.js.map +0 -1
  174. package/lib/renderers/wikimedia-mobile.renderer.d.ts +0 -19
  175. package/lib/renderers/wikimedia-mobile.renderer.js +0 -243
  176. package/lib/renderers/wikimedia-mobile.renderer.js.map +0 -1
  177. package/lib/util/articleListMainPage.d.ts +0 -3
  178. package/lib/util/articleListMainPage.js +0 -10
  179. package/lib/util/articleListMainPage.js.map +0 -1
  180. package/lib/util/articles.d.ts +0 -26
  181. package/lib/util/articles.js +0 -102
  182. package/lib/util/articles.js.map +0 -1
  183. package/lib/util/builders/url/desktop.director.d.ts +0 -8
  184. package/lib/util/builders/url/desktop.director.js +0 -15
  185. package/lib/util/builders/url/desktop.director.js.map +0 -1
  186. package/lib/util/builders/url/mobile.director.d.ts +0 -8
  187. package/lib/util/builders/url/mobile.director.js +0 -15
  188. package/lib/util/builders/url/mobile.director.js.map +0 -1
  189. package/lib/util/builders/url/rest-api.director.d.ts +0 -8
  190. package/lib/util/builders/url/rest-api.director.js +0 -18
  191. package/lib/util/builders/url/rest-api.director.js.map +0 -1
  192. package/lib/util/builders/url/visual-editor.director.d.ts +0 -9
  193. package/lib/util/builders/url/visual-editor.director.js +0 -18
  194. package/lib/util/builders/url/visual-editor.director.js.map +0 -1
  195. package/lib/util/saveArticles.d.ts +0 -8
  196. package/lib/util/saveArticles.js +0 -411
  197. package/lib/util/saveArticles.js.map +0 -1
  198. package/res/article_list_home.js +0 -24
  199. package/res/content.parsoid.css +0 -196
  200. package/res/inserted_style.css +0 -45
  201. package/res/templates/categories.html +0 -11
  202. package/res/templates/lead_section_wrapper.html +0 -6
  203. package/res/templates/pageWikimediaDesktop.html +0 -24
  204. package/res/templates/pageWikimediaMobile.html +0 -24
  205. package/res/templates/section_wrapper.html +0 -5
  206. package/res/templates/subcategories.html +0 -23
  207. package/res/templates/subpages.html +0 -17
  208. package/res/templates/subsection_wrapper.html +0 -5
  209. package/res/webpHandler.js +0 -165
  210. package/res/wm_mobile_override_script.js +0 -15
  211. package/res/wm_mobile_override_style.css +0 -20
  212. package/translation/br.json +0 -8
  213. package/translation/dag.json +0 -9
  214. package/translation/es-formal.json +0 -29
  215. package/translation/ha.json +0 -10
  216. package/translation/hi.json +0 -9
  217. package/translation/ig.json +0 -10
  218. package/translation/kaa.json +0 -9
  219. package/translation/nb.json +0 -9
  220. package/translation/nqo.json +0 -8
  221. package/translation/pt-br.json +0 -10
  222. package/translation/ro.json +0 -9
  223. package/translation/scn.json +0 -8
  224. package/translation/sq.json +0 -9
  225. package/translation/te.json +0 -9
  226. package/translation/tn.json +0 -9
  227. package/translation/tr.json +0 -10
@@ -1,185 +1,186 @@
1
- import Downloader from '../Downloader.js';
2
- import RedisStore from '../RedisStore.js';
3
- import * as logger from '../Logger.js';
4
- import { getArticlesByIds } from './mw-api.js';
5
- import { deDup } from './misc.js';
6
- export async function getCategoriesForArticles(articleStore, deleteArticleStore = false) {
7
- const { articleDetailXId } = RedisStore;
8
- const nextCategoriesBatch = RedisStore.createRedisKvs(`${Date.now()}-request`);
9
- logger.log(`Fetching categories for [${await articleStore.len()}] articles`);
10
- await articleStore.iterateItems(Downloader.speed, async (articleKeyValuePairs, runningWorkers) => {
11
- const articleKeys = Object.keys(articleKeyValuePairs);
12
- logger.log(`Worker getting categories for articles [${logger.logifyArray(articleKeys)}] - ${runningWorkers} worker(s) running`);
13
- const pagesXCategoryId = Object.entries(articleKeyValuePairs).reduce((acc, [, detail]) => {
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
- const nextBatchSize = await nextCategoriesBatch.len();
48
- if (nextBatchSize) {
49
- return getCategoriesForArticles(nextCategoriesBatch, true);
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
- return null;
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
- export async function trimUnmirroredPages() {
56
- const { articleDetailXId } = RedisStore;
57
- logger.log(`Trimming un-mirrored articles for [${await articleDetailXId.len()}] articles`);
58
- const numKeys = await articleDetailXId.len();
59
- let prevPercentProgress = -1;
60
- let processedArticles = 0;
61
- let modifiedArticles = 0;
62
- await articleDetailXId.iterateItems(Downloader.speed, async (articleKeyValuePairs) => {
63
- for (const [articleId, articleDetail] of Object.entries(articleKeyValuePairs)) {
64
- processedArticles += 1;
65
- if (typeof articleDetail.missing === 'string') {
66
- await articleDetailXId.delete(articleId);
67
- modifiedArticles += 1;
68
- // TODO: remove references to current article on delete
69
- continue;
70
- }
71
- const categoriesXId = (articleDetail.categories || []).reduce((acc, c) => {
72
- acc[c.title] = c;
73
- return acc;
74
- }, {});
75
- const categoryIds = Object.keys(categoriesXId);
76
- const subCategoriesXId = (articleDetail.subCategories || []).reduce((acc, c) => {
77
- acc[c.title] = c;
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
- const newSubCategoryKeys = deDup(existingSubCategories || [], (p) => p);
102
- const newSubCategories = newSubCategoryKeys.map((key) => subCategoriesXId[key]);
103
- if (newSubCategories.length !== subCategoryIds.length) {
104
- articleDetail.subCategories = newSubCategories;
105
- hasUpdated = true;
106
- }
107
- const newPageKeys = deDup(existingPages || [], (p) => p);
108
- const newPages = newPageKeys.map((key) => pagesXId[key]);
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
- return modifiedArticles;
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 simplifyGraph() {
129
- logger.log('Simplifying graph (removing empty categories)');
130
- const { articleDetailXId } = RedisStore;
131
- const numKeys = await articleDetailXId.len();
132
- let prevPercentProgress = -1;
133
- let processedArticles = 0;
134
- let deletedNodes = 0;
135
- await articleDetailXId.iterateItems(Downloader.speed, async (articleKeyValuePairs) => {
136
- for (const [articleId, articleDetail] of Object.entries(articleKeyValuePairs)) {
137
- processedArticles += 1;
138
- if (articleDetail.ns !== 14) {
139
- continue; // Only trim category articles
140
- }
141
- const subArticles = (articleDetail.subCategories || []).concat(articleDetail.pages || []);
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 (processedArticles % 10 === 0) {
176
- const percentProgress = Math.floor((processedArticles / numKeys) * 1000) / 10;
177
- if (percentProgress !== prevPercentProgress) {
178
- prevPercentProgress = percentProgress;
179
- logger.log(`Progress simplifying graph [${processedArticles}/${numKeys}] [${percentProgress}%] deleted [${deletedNodes}]`);
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
- return { deletedNodes };
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":"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"}
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/util/categories.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,19 @@
1
- export declare const MAX_CPU_CORES = 8;
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 MIN_IMAGE_THRESHOLD_ARTICLELIST_PAGE = 10;
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 DELETED_ARTICLE_ERROR = "Article has been deleted.";
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 WIKIMEDIA_REST_API_PATH = "/api/rest_v1/";
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 MAX_CPU_CORES = 8;
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 MIN_IMAGE_THRESHOLD_ARTICLELIST_PAGE = 10;
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 DELETED_ARTICLE_ERROR = 'Article has been deleted.';
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 ALL_READY_FUNCTION = /function allReady\( modules \) {/;
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 = ['WikimediaDesktop', 'VisualEditor', 'WikimediaMobile', 'RestApi', 'ActionParse'];
22
- export const WIKIMEDIA_REST_API_PATH = '/api/rest_v1/';
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
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/util/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAC9B,MAAM,CAAC,MAAM,qBAAqB,GAChC,6KAA6K,CAAA;AAC/K,MAAM,CAAC,MAAM,qBAAqB,GAAG,2CAA2C,CAAA;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,6DAA6D,CAAA;AACnG,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAA;AACtD,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,qBAAqB,GAAG,2BAA2B,CAAA;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AACvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,gCAAgC,CAAA;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG,sBAAsB,CAAA;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kCAAkC,CAAA;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,+DAA+D,CAAA;AAC7F,MAAM,CAAC,MAAM,QAAQ,GAAG,+BAA+B,CAAA;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAA;AAC9D,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,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;AAC/G,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAA;AAEtD;;;EAGE;AACF,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAA"}
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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"}