mirror of
https://github.com/viatsko/awesome-vscode.git
synced 2024-12-18 03:54:23 -05:00
Initial work on image conversion
This commit is contained in:
parent
e3224bd7d8
commit
ee72e64bf8
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
5
.prettierrc
Normal file
5
.prettierrc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "es5"
|
||||||
|
}
|
23
.vscode/settings.json
vendored
Normal file
23
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
// Enable per-language
|
||||||
|
"[javascript]": {
|
||||||
|
"editor.formatOnSave": true
|
||||||
|
},
|
||||||
|
|
||||||
|
// ESLint packageManager
|
||||||
|
"eslint.packageManager": "yarn",
|
||||||
|
|
||||||
|
// Excludes
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.cache": true,
|
||||||
|
"**/.idea": true,
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.svn": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/.DS_Store": true
|
||||||
|
},
|
||||||
|
"search.exclude": {
|
||||||
|
"**/public": true
|
||||||
|
}
|
||||||
|
}
|
10
package.json
10
package.json
@ -5,5 +5,13 @@
|
|||||||
"repository": "git@github.com:viatsko/awesome-vscode.git",
|
"repository": "git@github.com:viatsko/awesome-vscode.git",
|
||||||
"author": "Valerii Iatsko <viatsko@viatsko.me>",
|
"author": "Valerii Iatsko <viatsko@viatsko.me>",
|
||||||
"license": "CC0-1.0",
|
"license": "CC0-1.0",
|
||||||
"private": true
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"scripts:download-convert-images": "node ./scripts/download-convert-images.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"gifsicle": "^3.0.4",
|
||||||
|
"node-fetch": "^2.2.0",
|
||||||
|
"sharp": "^0.20.5"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
112
scripts/download-convert-images.js
Normal file
112
scripts/download-convert-images.js
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
const { spawn } = require('child_process');
|
||||||
|
const fs = require('fs');
|
||||||
|
const gifsicle = require('gifsicle');
|
||||||
|
const fetch = require('node-fetch');
|
||||||
|
const path = require('path');
|
||||||
|
const sharp = require('sharp');
|
||||||
|
const url = require('url');
|
||||||
|
|
||||||
|
/* regex, used to find all external image links in README.md */
|
||||||
|
const imagesRegEx = new RegExp('(https?://.*.(?:png|jpe?g|gif))', 'ig');
|
||||||
|
|
||||||
|
/* calculating paths */
|
||||||
|
const root = path.join(__dirname, '..');
|
||||||
|
const imagesPath = path.join(root, 'extensions', 'screenshots');
|
||||||
|
const readmeFile = path.join(root, 'README.md');
|
||||||
|
|
||||||
|
/* returns an array of external images in a file */
|
||||||
|
const findExternalImageLinks = filename => {
|
||||||
|
const contents = fs.readFileSync(filename, {
|
||||||
|
encoding: 'UTF-8',
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
let m;
|
||||||
|
while ((m = imagesRegEx.exec(contents))) {
|
||||||
|
result.push(m[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getBasename = link => {
|
||||||
|
return path.basename(url.parse(link).pathname);
|
||||||
|
};
|
||||||
|
|
||||||
|
const convertGif = async filename => {
|
||||||
|
const absolutePath = path.resolve(filename);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const gifStream = spawn(gifsicle, [
|
||||||
|
'--resize-fit-width',
|
||||||
|
'600',
|
||||||
|
absolutePath,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const fileStream = fs.createWriteStream(
|
||||||
|
`${absolutePath.substr(0, absolutePath.lastIndexOf('.'))}`
|
||||||
|
);
|
||||||
|
|
||||||
|
gifStream.stdout.pipe(fileStream);
|
||||||
|
|
||||||
|
fileStream.on('finish', () => {
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const convertSharp = async filename => {
|
||||||
|
const absolutePath = path.resolve(filename);
|
||||||
|
|
||||||
|
return sharp(filename)
|
||||||
|
.resize(600)
|
||||||
|
.toFile(absolutePath.substr(0, absolutePath.lastIndexOf('.')));
|
||||||
|
};
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
const externalImageLinks = findExternalImageLinks(readmeFile);
|
||||||
|
|
||||||
|
for (const link of externalImageLinks) {
|
||||||
|
/* assuming that links within this repo don't need any convertation */
|
||||||
|
if (
|
||||||
|
link.indexOf(
|
||||||
|
'https://raw.githubusercontent.com/viatsko/awesome-vscode'
|
||||||
|
) !== -1
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* getting just a filename out of a link */
|
||||||
|
const basename = getBasename(link).toLowerCase();
|
||||||
|
|
||||||
|
/* localPath is where the file will be stored in this repo */
|
||||||
|
const localPath = `${path.join(imagesPath, basename)}.tmp`;
|
||||||
|
|
||||||
|
/* downloading file */
|
||||||
|
const res = await fetch(link);
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
const fileStream = fs.createWriteStream(localPath);
|
||||||
|
|
||||||
|
res.body.pipe(fileStream);
|
||||||
|
|
||||||
|
res.body.on('error', err => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
fileStream.on('finish', function() {
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
process.stdout.write(`Downloaded ${link}\n`);
|
||||||
|
|
||||||
|
if (/gif$/i.test(basename)) {
|
||||||
|
await convertGif(localPath);
|
||||||
|
process.stdout.write(`Converted .gif ${link}\n`);
|
||||||
|
} else {
|
||||||
|
await convertSharp(localPath);
|
||||||
|
process.stdout.write(`Converted using sharp ${link}\n`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
Loading…
Reference in New Issue
Block a user