将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, 图片存储在 zhaooleeEasyTypora 仓库的 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项目

  1. 将本项目根目录下main.js放入目标项目根目录,运行即可(如果报错依赖包缺失,记得npm i request fs-extra -D 补包)

  2. main.js程序运行完成后, 运行

git add README
git commit -m "新增README图片"
git push

如果是非node.js项目

  1. 下载本项目,并安装依赖包
git clone https://github.com/zhaoolee/replace_readme_md_image.git
cd replace_readme_md_image
npm i
  1. 删除本项目下的 REAEME.md 文件和README文件夹和.git文件夹

  2. 将需要转换的README.md文案件和.git文件夹放入项目根目录, 如果REAMD.md中含本地相对路径的图片文件, 请手动调整路径

  3. 运行npm start, 生成新的README.md文件和README文件夹

  4. 将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地址的图片相关推荐

  1. 【Github】怎么在README.md中添加图片?

    原理是将图片作为文档上传,在README.md中引用即可. 参考博客:[GitHub]给GitHub上的ReadMe.md文件中添加图片怎么做 . gitHub创建文件夹

  2. github的ReadMe.md中如何使用图片

    1.上传到项目下 上传到项目下,然后记录下需要图片的地址 2.ReadMe.md中引用 类似如下,加上链接即可 #### 4.关于 欢迎一起完善本项目(提issue或者加微信),如果有任何疑问,请通过 ...

  3. github用相对路径显示图片_url-图像未显示在GitHub的README.md中

    更新内容 自2013年1月30日起,GitHub现在支持标记文档中的相对链接. 这意味着您的代码.md现在可以正常工作. 正如@Brad指出的那样,这还可以缓解以下情况:两个分支中的图像不同,但具有相 ...

  4. github用相对路径显示图片_我写了一个开源工具, 让Github的README.md可以正常显示超大图片...

    最终效果对比 图片替换前: 图片显示有好有坏,能否显示,全凭运气 图片替换后: 所有大图正常显示! 本项目永久开源地址 痛点: Github的README.md展示图片效果并不完美 为了让项目演示更生 ...

  5. 【Git】GitHub设置README.md引用本repo目录下的图片

    我们在完善GitHub的repo时,往往需要完善其README.md.图片是一种表现力较强的呈现形式,引入图片也是Markdown支持的语法,因此有时候我们需要将一些图片放在README.md中显示给 ...

  6. 怎么给README.md添加图片(两种方法,图文教程)?

    当你想要更好的介绍自己的项目的时候,发现别人的readme都是下面很多花里胡哨的图片介绍,而自己只能写字 其实添加图片有两种方式: 第一种: 在README.MD文件中写入 如果这样写的话png就得放 ...

  7. 【Git】GitHub同名项目实现丰富多彩的README.md

    文章目录 导读 徽章图片 Emoji 数据统计 贪吃蛇 导读 README.md作为Markdown文件,GitHub支持了Markdown的基本语法,但不支持CSDN提供的强大的公式编辑$$功能以及 ...

  8. README.md 文件的作用和语法

    一.README.md 文件的作用 md文件一般出现在项目的根目录下面,其作用是:对项目的主要信息进行描述. 如果一个项目你很长时间都没有动,突然你需要修改这个项目,那么通过README.md中对项目 ...

  9. gitbook README.md

    Gitbook README.md 文章目录 Gitbook README.md 1. 自述和介绍 2. 其他文件替代 README.md 1. 自述和介绍 书本的首页内容默认是从文件 README. ...

最新文章

  1. WebSocket的几个模块(node.js)(未完)
  2. 联结你与万物的8种元素
  3. 转载:mouseOver/mouseOut 与 rollOver/rollOut的区别
  4. php面试基础项目,PHP面试经典题
  5. 并发集合和普通集合以及安全集合的区别
  6. Bootstrap css3
  7. C#的二进制序列化组件MessagePack介绍
  8. 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录
  9. 【华为云技术分享】【Python算法】分类与预测——决策树
  10. 软件portable
  11. Hadoop家族学习路线图v
  12. Atiitt 可视化 报表 图表之道 attilax著 Atitit.可视化与报表原理与概论 1.  信息可视化 1 2. Gui可视化 2 2.1. atitit 知识的可视化.docx 2
  13. 让你相见恨晚的Photoshop 技巧
  14. 大数据之Hadoop3简单入门(一)(通俗易懂)
  15. Java小白 前端后端开发 环境搭建【jdk+idea+webstorm+maven+nodejs+vue+mysql】
  16. Git-用 cherry-pick 挑好看的小樱桃
  17. AOP防止表单重复提交
  18. 解释reverse=True等python基础问题
  19. sqlite多进程并发读写模式下,返回SQLITE_BUSY错误的处理方法
  20. 数字化转型与智能创新100个案例

热门文章

  1. php 发短信的类,[php封装类]PHP封装发送短信类!
  2. Win2000的优化
  3. pandas读取带有合并单元格的excel表格
  4. CSS3:overflow属性详解
  5. 仙道服务器维护,《问道》手游02月25日04:50分维护公告
  6. 【python】从Ensembl上,根据Array HumanMethylation450甲基化探针cg编号(比如cg13788592)获取位置
  7. k8s-------(| 五 |)调度器 scheduler,亲和(affinity),污点(taint),容忍(tolerations),标签labels
  8. 选拔赛 c 武器大师的宝贝
  9. eclipse git导入的项目 让修改后的文件带有黑色星标记样式
  10. 三星S5_G9008V 解锁联通4G(安卓6.0)