【悲战蓝桥杯国赛】找到未引用的图片

介绍

小蓝在公司负责图文编辑器的开发,每次在编辑器中插入图片都会调用一次上传接口,将图片上传至服务器中,但是文章最终编辑完成时可能并未引用所有上传的图片,这就导致许多“无效文件”的产生,于是小蓝想编写一个维护脚本,定期清理那些未被引用的图片文件。

下面就请你使用 Node.js 帮助小蓝找出那些未引用的图片。

准备

开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:

├── articles
├── images
├── index.js
└── test.js

其中:

  • articles 是项目的文章目录。
  • images 是项目的图片目录。
  • test.js 是验证答案是否正确的工具方法。
  • index.js 是需要补充代码的 js 文件。

注意:打开环境后发现缺少项目代码,请复制下述命令至命令行进行下载。

wget https://labfile.oss.aliyuncs.com/courses/16666/dist_04.zip
unzip dist_04.zip
mv dist/* ./
rm -rf dist*

目标

找到 index.js 中的 findUnlinkImages 函数,完善其中的 TODO 部分。使用 Node.js 中的 fs 等内置模块进行文件操作,查找出 images 目录下未被任何文章(articles 文件夹下的 .md 文档)引用的“无效图片”,最终需要在 findUnlinkImages 这个函数中返回包含这些“无效图片”的数组。

提示:Markdown 中插入图片语法为:![](xxxxxx.png)

提示:代码中提供了工具函数 traversalDirsearchImage 可供参考使用。

请保证封装的函数满足所有测试用例,并在终端运行以下命令:

node test.js

如果你的结果正确,则在终端将会输出“测试通过”。

规定

  • 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径、class 名、id 名、图片名等,以免造成无法判题通过。
  • 满足需求后,保持 Web 服务处于可以正常访问状态,点击「提交检测」系统会自动检测。

判分标准

const path = require("path");
const fs = require("fs");

const articlesPath = path.resolve(__dirname, "articles");
const imagesPath = path.resolve(__dirname, "images");

const findUnlinkImages = async function () {
  const unlinkImages = []; // 未被任何 md 文件引用的图片的数组

  // 获取 articles 目录下的文件列表
  let allArticleFiles = await traversalDir(articlesPath);

  // 获取 images 目录下的文件列表
  let allImageFiles = await traversalDir(imagesPath);

  // 将 images 目录下的文件路径格式化为相对路径
  let allImagePaths = allImageFiles.map(fileName => `../images/${fileName}`);

  // 遍历所有文章文件,提取其中引用的图片路径
  allArticleFiles.forEach(articleFile => {
    // 获取文章文件内容
    let articleContent = fs.readFileSync(`${articlesPath}/${articleFile}`, "utf-8");

    // 提取文章内容中的图片路径,并添加到全局 useImgs 数组中
    searchImage(articleContent);
  });

  // 过滤出未被引用的图片路径
  let unlinkedImagePaths = allImagePaths.filter(imagePath => !useImgs.includes(imagePath));

  // 将未被引用的图片路径添加到 unlinkImages 数组中
  unlinkImages.push(...unlinkedImagePaths);

  return unlinkImages; // 返回未被引用的图片路径数组
};

// 调用 findUnlinkImages 函数并输出结果
findUnlinkImages().then((unlinkImages) => {
  console.log("Unlinked images:", unlinkImages);
});

// 遍历目录,返回文件列表
function traversalDir(dirPath) {
  return new Promise((resolve) => {
    fs.readdir(dirPath, function (err, files) {
      if (!err) {
        resolve(files);
      }
    });
  });
}

let useImgs = []; // 用于存储文章中引用的图片路径

/**
 * 提取文章内容中的图片链接
 * @param {string} md 传入的 markdown 文本内容
 * @returns 包含所有图片链接的数组
 */
function searchImage(md) {
  const pattern = /!\[(.*?)\]\((.*?)\)/gm; // 匹配 Markdown 图片链接的正则表达式
  let matcher;
  while ((matcher = pattern.exec(md)) !== null) {
    if (matcher[2].indexOf("images") !== -1) {
      // 如果链接中包含 "images",说明是图片链接
      useImgs.push(matcher[2]); // 将图片链接添加到 useImgs 数组中
    }
  }
  return useImgs; // 返回包含所有图片链接的数组
}

module.exports = findUnlinkImages; // 请勿删除该行代码, 否则影响判题!
© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发

    暂无评论内容