Skip to content

Commit d3f0309

Browse files
Only download cache for system languages and English (#420)
Co-authored-by: Matthew Peveler <[email protected]>
1 parent 7ad3c5a commit d3f0309

9 files changed

+206
-213
lines changed

config.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"pagesRepository": "https://github.com/tldr-pages/tldr",
3-
"repository": "https://tldr.sh/assets/tldr.zip",
3+
"repositoryBase": "https://tldr.sh/assets/tldr-pages",
44
"skipUpdateWhenPageNotFound": false,
55
"themes": {
66
"simple": {

lib/cache.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ class Cache {
4848
return Promise.all([
4949
// Create new temporary folder
5050
fs.ensureDir(tempFolder),
51-
fs.ensureDir(this.cacheFolder)
51+
fs.ensureDir(this.cacheFolder),
5252
])
5353
.then(() => {
5454
// Download and extract cache data to temporary folder
55-
return remote.download(tempFolder);
55+
return Promise.allSettled(this.config.languages.map((lang) => {
56+
return remote.download(tempFolder, lang);
57+
}));
5658
})
5759
.then(() => {
5860
// Copy data to cache folder
@@ -62,7 +64,7 @@ class Cache {
6264
return Promise.all([
6365
// Remove temporary folder
6466
fs.remove(tempFolder),
65-
index.rebuildPagesIndex()
67+
index.rebuildPagesIndex(),
6668
]);
6769
})
6870
// eslint-disable-next-line no-unused-vars

lib/config.js

+17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const defaults = require('lodash/defaults');
44
const fs = require('fs');
55
const path = require('path');
6+
const utils = require('./utils');
67
const osHomedir = require('os').homedir;
78

89
exports.get = () => {
@@ -35,6 +36,22 @@ exports.get = () => {
3536
if (errors.length > 0) {
3637
throw new Error('Error in .tldrrc configuration:\n' + errors.join('\n'));
3738
}
39+
40+
// Setting correct languages
41+
merged.languages = ['en'];
42+
// Get the primary & secondary language.
43+
let langs = utils.localeToLang(process.env.LANG);
44+
merged.languages = merged.languages.concat(langs);
45+
46+
if(process.env.LANGUAGE !== undefined) {
47+
let langs = process.env.LANGUAGE.split(':');
48+
49+
merged.languages.push(...langs.map((lang) => {
50+
return utils.localeToLang(lang);
51+
}));
52+
}
53+
merged.languages = [...new Set(merged.languages)];
54+
3855
return merged;
3956
};
4057

lib/remote.js

+31-21
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,44 @@
11
'use strict';
22

3-
const unzip = require('node-unzip-2');
3+
const path = require('path');
4+
const fs = require('fs-extra');
5+
const unzip = require('adm-zip');
46
const config = require('./config');
57
const axios = require('axios');
68

79
// Downloads the zip file from github and extracts it to folder
8-
exports.download = (path) => {
9-
const url = config.get().repository;
10+
exports.download = (loc, lang) => {
11+
// If the lang is english then keep the url simple, otherwise add language.
12+
const suffix = (lang === 'en' ? '' : '.' + lang);
13+
const url = config.get().repositoryBase + suffix + '.zip';
14+
const folderName = path.join(loc, 'pages' + suffix);
15+
const REQUEST_TIMEOUT = 10000;
1016

11-
// Creating the extractor
12-
const extractor = unzip.Extract({ path });
13-
14-
let req = axios({
17+
return axios({
1518
method: 'get',
1619
url: url,
1720
responseType: 'stream',
18-
headers: { 'User-Agent' : 'tldr-node-client' }
19-
}).then(function (response) {
20-
response.data.pipe(extractor);
21-
});
21+
headers: { 'User-Agent' : 'tldr-node-client' },
22+
timeout: REQUEST_TIMEOUT,
23+
}).then((response) => {
24+
return new Promise((resolve, reject) => {
25+
let fileName = path.join(loc, 'download_' + lang + '.zip');
2226

23-
return new Promise((resolve, reject) => {
24-
req.catch((err) => {
25-
reject(err);
26-
});
27-
extractor.on('error', () => {
28-
reject(new Error('Cannot update from ' + url));
29-
});
30-
extractor.on('close', () => {
31-
resolve();
27+
const writer = fs.createWriteStream(fileName);
28+
response.data.pipe(writer);
29+
30+
writer.on('finish', () => {
31+
writer.end();
32+
const zip = new unzip(fileName);
33+
34+
zip.extractAllTo(folderName, true);
35+
fs.unlinkSync(fileName);
36+
resolve();
37+
}).on('error', (err) => {
38+
reject(err);
39+
});
3240
});
41+
}).catch((err) => {
42+
return Promise.reject(err);
3343
});
34-
};
44+
};

lib/utils.js

+25
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,31 @@ module.exports = {
2424
return langParts[1];
2525
},
2626

27+
localeToLang(locale) {
28+
if(locale === undefined || locale.startsWith('en')) return [];
29+
30+
const withDialect = ['pt', 'zh'];
31+
32+
let lang = locale;
33+
if(lang.includes('.')) {
34+
lang = lang.substring(0, lang.indexOf('.'));
35+
}
36+
37+
// Check for language code & country code.
38+
let ll = lang, cc = '';
39+
if(lang.includes('_')) {
40+
cc = lang.substring(lang.indexOf('_') + 1);
41+
ll = lang.substring(0, lang.indexOf('_'));
42+
}
43+
44+
// If we have dialect for this language take dialect as well.
45+
if(withDialect.indexOf(ll) !== -1 && cc !== '') {
46+
return [ll, ll + '_' + cc];
47+
}
48+
49+
return [ll];
50+
},
51+
2752
isPage(file) {
2853
return path.extname(file) === '.md';
2954
},

0 commit comments

Comments
 (0)