将README.md中的图片替换为github地址的图片
将README.md中的图片替换为github地址的图片
本项目永久更新地址
https://github.com/zhaoolee/replace_readme_md_image
痛点: Github的README.md展示图片效果并不完美
为了让项目演示更生动形象, 我们可以往README.md中插入一些图片
但Github会对README.md中的站外图片会进行地址转换,如果图片尺寸很小,这种转换完全没有问题, 但如果图片尺寸稍大, github的只能转换出半张图, 图片展示的效果极差
比如 将https://v2fy.com/asset/bilibili_wallpaper/3203841-ee56972a7e14ff43.png
转换为https://camo.githubusercontent.com/e2b664d80ebe666681016c66d2b42ee9f8f9ec3e6c73d3a34accdaadba84b23a/687474703a2f2f763266792e636f6d2f61737365742f62696c6962696c695f77616c6c70617065722f333230333834312d656535363937326137653134666634332e706e67
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3y89fMYo-1610277062205)(https://raw.githubusercontent.com/zhaoolee/replace_readme_md_image/master/README/1610273620185zKKRYDmG.gif)]
原图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vcN6Zl6k-1610277062207)(https://raw.githubusercontent.com/zhaoolee/replace_readme_md_image/master/README/1610273620196RMdHJK1N.png)]
被github转换后的图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTOvMc0B-1610277062208)(https://raw.githubusercontent.com/zhaoolee/replace_readme_md_image/master/README/1610273620453w1B3jNPE.png)]
如何解决README.md中大图展示不完美的问题?
将图片上传的到github即可!
我们可以将README.md中的图片存储到仓库根目录的README文件夹, 然后用图片在github的url, 替换原有的图片链接.
我分析了一下github 仓库中包含图片的url的规则
https://raw.githubusercontent.com/
+ 用户名
+ /
+ 仓库名
+ /master/
+ 相对仓库根目录的文件夹路径
+ /
+ 图片名
;
如果图片名称为1610212776529GNazs3pP.gif, 图片存储在 zhaoolee
的 EasyTypora
仓库的 README
文件夹下,那它的最终url为
https://raw.githubusercontent.com/zhaoolee/EasyTypora/master/README/1610212776529GNazs3pP.gif
但是手工替换所有的图片太累了, 于是我写了一个自动化的程序
- 程序支持转换网络图片为github路径
- 程序支持转换本地路径图片为github路径
- 程序自动读取仓库下的
.git/config
,获取用户名和仓库名称 - 自动判断前缀, 对于已经转换的图片, 重复运行程序无需重新爬取,节约流量!
const request = require("request");
const fs = require("fs-extra");
const path = require("path");// 读取用户输入
async function readline_sync() {const readline = require('readline').createInterface({input: process.stdin,output: process.stdout})return new Promise((resolve, reject) => {readline.question(``, data => {readline.close();resolve(data)})});
}async function get_github_username_repositories_name() {// 查看.git文件夹是否存在let exist = fs.existsSync(path.join(__dirname, ".git", "config"));// 如果.git存在则读取username和repositories_namelet username = "";let repositories_name = "";let url = "";if (exist) {let config_content = String(fs.readFileSync(path.join(__dirname, ".git", "config")))let re_n_t = /\n|\t/;let config_content_list = config_content.split(re_n_t)for (let i = 0, config_content_list_length = config_content_list.length; i < config_content_list_length; i++) {if (config_content_list[i].indexOf("url") === 0) {url = config_content_list[i].split("url = ")[1];url = url.split(".git")[0]let url_info = url.split("/");// console.log(url_info);url_info.reverse();username = url_info[1];repositories_name = url_info[0];}}}// 如果.git不存在则要求输入username和repositories_nameif (exist === false) {console.log("请输入github用户名:");username = await readline_sync();console.log("请输入仓库名:");repositories_name = await readline_sync();}console.log(username, repositories_name);return new Promise((resolve, reject) => {resolve({ username: username, repositories_name: repositories_name })})}function get_img_url_list_in_md(md_path) {const md_content = String(fs.readFileSync(md_path));re_md_img = /\!\[(.*)\]\((.*)\)/g;let md_img_list = md_content.match(re_md_img);console.log(md_img_list);let img_url_list = [];for (let i = 0, md_img_list_length = md_img_list.length; i < md_img_list_length; i++) {img_url = md_img_list[i].match(/(.*)\((.*)\)/)[2];img_url_list.push(img_url);}return img_url_list;}// 创建随机数函数
// 随机产生字符串
function randomString(e) {e = e || 32;var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz012345678",a = t.length,n = "";for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));return n
}function download_img_to_readme_dir(img_url, pre_image_url){let new_img_url = "";return new Promise((resolve, reject)=>{// 如果以http开头,则进行下载if(img_url.indexOf("http") === 0){try {let img_url_info = img_url.split(".")img_url_info.reverse();let ext = img_url_info[0];let new_img_name = Date.now() + randomString(8) + "." + ext;request.get(img_url).pipe(fs.createWriteStream(path.join(__dirname, "README", new_img_name))).on("close", function(err){new_img_url = pre_image_url + new_img_name;resolve(new_img_url);});}catch(e){console.log(e);new_img_url = img_url;resolve(new_img_url);}}// 如果不以http开头,则是本地图片,进行拷贝即可else {let img_url_info = img_url.split(".")img_url_info.reverse();let ext = img_url_info[0];let new_img_name = Date.now() + randomString(8) + "." + ext;fs.createReadStream(img_url).pipe(fs.createWriteStream(path.join(__dirname, "README", new_img_name))).on("close", function(err){new_img_url = pre_image_url + new_img_name;resolve(new_img_url);});}})}function replace_readme_info ( src_text, dest_text) {// 获取README.md原始信息let readme_content = String(fs.readFileSync(path.join(__dirname, "README.md")));let new_readme_content = readme_content.replace(src_text, dest_text);fs.writeFileSync(path.join(__dirname, "README.md"), new_readme_content);}async function main() {// 获取仓库的用户名和仓库名let { username, repositories_name } = await get_github_username_repositories_name();// console.log(username_repositories_name);// username = username_repositories_name.username;// repositories_name = username_repositories_name.repositories_name;console.log(username, repositories_name);// 备份README.md为README_BEFORE.mdfs.copyFileSync(path.join(__dirname, "README.md"), path.join(__dirname, "README_BEFORE.md"))// 拼接README图片前缀let pre_image_url = "https://raw.githubusercontent.com/" + username + "/" + repositories_name + "/master/README/"// 获取README.md里面的所有图片地址列表let img_url_list = get_img_url_list_in_md(path.join(__dirname, "README.md"));// 如果README文件夹不存在,则创建README文件夹if ((fs.existsSync(path.join(__dirname, "README"))) === false) {fs.mkdirSync(path.join(__dirname, "README"))}for (let i = 0, img_url_list_length = img_url_list.length; i < img_url_list_length; i++) {// 如果图片以pre_image_url开头,则跳过if (img_url_list[i].indexOf(pre_image_url) === -1) {// 将图片下载到README文件夹,并生成图片github地址let new_img_url = await download_img_to_readme_dir(img_url_list[i], pre_image_url);// 替换README.md内图片地址为github地址replace_readme_info(img_url_list[i], new_img_url);console.log("将==》",img_url_list[i] ,"替换为==》",new_img_url);}}}main();
如何使用本项目
如果是node.js项目
将本项目根目录下main.js放入目标项目根目录,运行即可(如果报错依赖包缺失,记得npm i request fs-extra -D 补包)
main.js程序运行完成后, 运行
git add README
git commit -m "新增README图片"
git push
如果是非node.js项目
- 下载本项目,并安装依赖包
git clone https://github.com/zhaoolee/replace_readme_md_image.git
cd replace_readme_md_image
npm i
删除本项目下的 REAEME.md 文件和README文件夹和.git文件夹
将需要转换的README.md文案件和.git文件夹放入项目根目录, 如果REAMD.md中含本地相对路径的图片文件, 请手动调整路径
运行
npm start
, 生成新的README.md文件和README文件夹将README.md文件和README文件夹放入原项目中, 原项目运行
git add README
git commit -m "新增README图片"
git push
最终效果对比
图片替换前: 图片显示有好有坏,能否显示,全凭运气
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILnSEtTn-1610277062210)(https://raw.githubusercontent.com/zhaoolee/replace_readme_md_image/master/README/1610273620185zKKRYDmG.gif)]
图片替换后: 所有大图正常显示!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6c07Qfo-1610277062211)(https://raw.githubusercontent.com/zhaoolee/replace_readme_md_image/master/README/16102767579577iDsT3A4.gif)]
将README.md中的图片替换为github地址的图片相关推荐
- 【Github】怎么在README.md中添加图片?
原理是将图片作为文档上传,在README.md中引用即可. 参考博客:[GitHub]给GitHub上的ReadMe.md文件中添加图片怎么做 . gitHub创建文件夹
- github的ReadMe.md中如何使用图片
1.上传到项目下 上传到项目下,然后记录下需要图片的地址 2.ReadMe.md中引用 类似如下,加上链接即可 #### 4.关于 欢迎一起完善本项目(提issue或者加微信),如果有任何疑问,请通过 ...
- github用相对路径显示图片_url-图像未显示在GitHub的README.md中
更新内容 自2013年1月30日起,GitHub现在支持标记文档中的相对链接. 这意味着您的代码.md现在可以正常工作. 正如@Brad指出的那样,这还可以缓解以下情况:两个分支中的图像不同,但具有相 ...
- github用相对路径显示图片_我写了一个开源工具, 让Github的README.md可以正常显示超大图片...
最终效果对比 图片替换前: 图片显示有好有坏,能否显示,全凭运气 图片替换后: 所有大图正常显示! 本项目永久开源地址 痛点: Github的README.md展示图片效果并不完美 为了让项目演示更生 ...
- 【Git】GitHub设置README.md引用本repo目录下的图片
我们在完善GitHub的repo时,往往需要完善其README.md.图片是一种表现力较强的呈现形式,引入图片也是Markdown支持的语法,因此有时候我们需要将一些图片放在README.md中显示给 ...
- 怎么给README.md添加图片(两种方法,图文教程)?
当你想要更好的介绍自己的项目的时候,发现别人的readme都是下面很多花里胡哨的图片介绍,而自己只能写字 其实添加图片有两种方式: 第一种: 在README.MD文件中写入 如果这样写的话png就得放 ...
- 【Git】GitHub同名项目实现丰富多彩的README.md
文章目录 导读 徽章图片 Emoji 数据统计 贪吃蛇 导读 README.md作为Markdown文件,GitHub支持了Markdown的基本语法,但不支持CSDN提供的强大的公式编辑$$功能以及 ...
- README.md 文件的作用和语法
一.README.md 文件的作用 md文件一般出现在项目的根目录下面,其作用是:对项目的主要信息进行描述. 如果一个项目你很长时间都没有动,突然你需要修改这个项目,那么通过README.md中对项目 ...
- gitbook README.md
Gitbook README.md 文章目录 Gitbook README.md 1. 自述和介绍 2. 其他文件替代 README.md 1. 自述和介绍 书本的首页内容默认是从文件 README. ...
最新文章
- WebSocket的几个模块(node.js)(未完)
- 联结你与万物的8种元素
- 转载:mouseOver/mouseOut 与 rollOver/rollOut的区别
- php面试基础项目,PHP面试经典题
- 并发集合和普通集合以及安全集合的区别
- Bootstrap css3
- C#的二进制序列化组件MessagePack介绍
- 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录
- 【华为云技术分享】【Python算法】分类与预测——决策树
- 软件portable
- Hadoop家族学习路线图v
- Atiitt 可视化 报表 图表之道 attilax著 Atitit.可视化与报表原理与概论 1. 信息可视化	1 2. Gui可视化	2 2.1. atitit 知识的可视化.docx	2
- 让你相见恨晚的Photoshop 技巧
- 大数据之Hadoop3简单入门(一)(通俗易懂)
- Java小白 前端后端开发 环境搭建【jdk+idea+webstorm+maven+nodejs+vue+mysql】
- Git-用 cherry-pick 挑好看的小樱桃
- AOP防止表单重复提交
- 解释reverse=True等python基础问题
- sqlite多进程并发读写模式下,返回SQLITE_BUSY错误的处理方法
- 数字化转型与智能创新100个案例
热门文章
- php 发短信的类,[php封装类]PHP封装发送短信类!
- Win2000的优化
- pandas读取带有合并单元格的excel表格
- CSS3:overflow属性详解
- 仙道服务器维护,《问道》手游02月25日04:50分维护公告
- 【python】从Ensembl上,根据Array HumanMethylation450甲基化探针cg编号(比如cg13788592)获取位置
- k8s-------(| 五 |)调度器 scheduler,亲和(affinity),污点(taint),容忍(tolerations),标签labels
- 选拔赛 c 武器大师的宝贝
- eclipse git导入的项目 让修改后的文件带有黑色星标记样式
- 三星S5_G9008V 解锁联通4G(安卓6.0)