当前位置: 首页 > news >正文

Node.js实现一个文章生成器

前言

本文将从零开始,讲解如何使用Node.js来实现一个文章生成器

node里面有很多优秀的模块,现在我们就借助node的fs模块来操控文本,来实现我们想要的效果

效果展示

动画.gif

  • 体验 fs

首先我们先创建一个json文件

image.png

里面放一些内容

image.png

接下来我们书写代码

import fs from "fs";
const data = fs.readFileSync("./cuepus/data.json", "utf-8", (err, data) => {if (!err) {// console.log(data);} else {console.log(err);}
});

image.png

可以看到我们就能读取到文件里的数据,这里我们体验了fs里面强大的功能

在这里我们放了文章的一些必须点,如文章内容、标题等,通过随机拿取数据生成一个文章

image.png

这里我们通过

import { fileURLToPath } from "url";
import { dirname,resolve } from "path";

去操控获取绝对路径

const url = import.meta.url;// 获取当前文件的绝对路径 
console.log(url);
console.log(fileURLToPath(url));
console.log(dirname(fileURLToPath(url)));
// 获取文件的绝对路径
const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json"); console.log(path);
  1. const url = import.meta.url; :使用了import.meta 对象来获取当前模块文件的绝对 URL 路径,并将其赋值给变量 url
  2. console.log(fileURLToPath(url)); :将url路径转换为文件系统路径
  3. console.log(dirname(fileURLToPath(url))); :将url转换为文件系统路径,然后通过 dirname 函数获取该路径的目录部分
  4. const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json"); :将前面获取到的目录部分和相对路径 "./cuepus/data.json" 进行组合,生成一个完整的文件绝对路径,并将其赋值给变量 path

接下来我们代码就可以写成以下的形式

import fs from "fs";
import { fileURLToPath } from "url";
import { dirname,resolve } from "path";const url = import.meta.url;// 获取当前文件的绝对路径
// 获取文件的绝对路径
const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json");
const data = fs.readFileSync(path, "utf-8", (err, data) => {if (!err) {// console.log(data);} else {console.log(err);}
});console.log(JSON.parse(data));

接下来我们写封装两个函数

random.js

export function randomInt(min, max) {const n = Math.random()return Math.floor(min * (1 - n) + max * n)
}export function createRandomPicker(arr) {arr = [...arr]function randomPick() { const len = arr.length - 1const index = randomInt(0, len);[arr[index], arr[len]] = [arr[len], arr[index]]return arr[index]}randomPick()  // 放弃第一次结果return randomPick
}

首先,定义了一个名为 randomInt 的导出函数,它接受两个参数 minmax ,用于生成指定范围内的随机整数。

然后,定义了一个名为 createRandomPicker 的导出函数,它接受一个数组 arr 作为参数。

在函数内部,先对传入的数组进行了复制,以避免修改原始数组。

接着,定义了一个内部函数 randomPick ,它的功能是:

  1. 计算数组的有效长度。
  2. 生成一个在有效范围内的随机索引。
  3. 通过交换将随机索引处的元素与最后一个元素交换位置。
  4. 返回交换后的随机索引处的元素。

在函数体中,首先调用了一次 randomPick 函数,但放弃了这次的结果。

最后,返回 randomPick 函数,以便外部可以调用它来获取随机抽取的数组元素。

generator.js

import { randomInt, createRandomPicker } from './random.js'// 替换文本
function sentence(pick, replacer) {let ret = pick()  // 得到一个句子for (const key in replacer) {ret = ret.replace(new RegExp(`{{${key}}}`, 'g'), typeof replacer[key] === 'function' ? replacer[key]() : replacer[key]) }return ret
}export function generate(title, { corpus, min = 500, max = 800 }) {const articleLenth = randomInt(min, max)const { famous, bosh_before, bosh, conclude, said } = corpusconst [pickFamous, pickBoshBefore, pickBosh, pickConclude, pickSaid] = [famous, bosh_before, bosh, conclude, said].map(createRandomPicker)const article = []let totalLength = 0while (totalLength < articleLenth) {  // 生成文章let section = ''const sectionLength = randomInt(100, 300)while (section.length < sectionLength) {  // 生成段落const n = randomInt(0, 100)if (n < 20) {section += sentence(pickFamous, {said: pickSaid, conclude: pickConclude})} else if (n < 50) {section += sentence(pickBoshBefore, { title }) + sentence(pickBosh, { title })} else {section += sentence(pickBosh, { title })}}totalLength += section.lengtharticle.push(section)}return article
}

'./random.js' 模块导入了 randomIntcreateRandomPicker 两个函数。

然后,定义了 sentence 函数,它接受两个参数 pickreplacer

pick 函数用于获取一个句子,然后通过遍历 replacer 对象中的键,使用正则表达式匹配并替换句子中特定的模板字符串(形如 {{key}} )。如果对应的值是函数,则调用函数获取结果进行替换,否则直接使用值进行替换。

接下来,定义了 generate 函数,它接受三个参数:title 、一个包含配置信息的对象(包含 corpus 以及可选的 minmax )。

在函数内部:

  1. 通过 randomInt 生成一个在 minmax 范围内的文章长度 articleLenth
  2. corpus 对象中解构出几个部分,并对每个部分使用 createRandomPicker 函数创建随机选择器。
  3. 通过一个循环生成文章内容,每次循环生成一个段落。在生成段落的过程中,根据随机数决定使用不同的句子生成方式,并通过 sentence 函数进行处理和组合。
  4. 不断累加段落的长度,直到总长度达到 articleLenth ,最终将生成的文章段落组成一个数组返回。

最后调用即可,修改index.js

import fs from 'fs'
import { fileURLToPath } from 'url'
import { dirname, resolve } from 'path'
import { generate } from './lib/generator.js'
import { createRandomPicker } from './lib/random.js'function loadCorpus(src) {const url = import.meta.url  // 读取当前脚本的绝对路径const path = resolve(dirname(fileURLToPath(url)), src)const data = fs.readFileSync(path, {encoding: 'utf8'})return JSON.parse(data)
}
const corpus = loadCorpus('curpus/data.json')
const pickTitle = createRandomPicker(corpus.title)
const title = pickTitle()const article = generate(title, { corpus })fs.writeFileSync(`./output/${title}.txt`, article.join(''));

总结

本文本文将从零开始,讲解如何使用Node.js来实现一个文章生成器

希望看到这里的你能够有所收获!!!!自己动手实现一个简易的文章生成器吧

后期可以结合AI去实现更加智能的文章生成器

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • YOLOv8改进 | 注意力机制 | 结合静态和动态上下文信息的注意力机制
  • 2024年6月份找工作和面试总结
  • RabbitMQ 更改服务端口号
  • 力扣1895.最大的幻方
  • 51单片机嵌入式开发:3、STC89C52操作8八段式数码管原理
  • NativeMemoryTracking查看java内存信息
  • udp发送数据如果超过1个mtu时,抓包所遇到的问题记录说明
  • 9 redis,memcached,nginx网络组件
  • 单/多线程--协程--异步爬虫
  • 洛谷 P2141 [NOIP2014 普及组] 珠心算测验
  • Harris点云关键点检测
  • 三、docker配置阿里云镜像仓库并配置docker代理
  • 使用瀚高数据库开发管理工具进行数据的备份与恢复---国产瀚高数据库工作笔记008
  • 使用Python绘制堆积柱形图
  • Ubuntu22.04使用/etc/rc.local开机启动程序
  • [译]CSS 居中(Center)方法大合集
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • AngularJS指令开发(1)——参数详解
  • Java编程基础24——递归练习
  • Just for fun——迅速写完快速排序
  • Linux链接文件
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Odoo domain写法及运用
  • Python打包系统简单入门
  • React中的“虫洞”——Context
  • select2 取值 遍历 设置默认值
  • Service Worker
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • tweak 支持第三方库
  • VUE es6技巧写法(持续更新中~~~)
  • vue.js框架原理浅析
  • vue脚手架vue-cli
  • 对JS继承的一点思考
  • 二维平面内的碰撞检测【一】
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 老板让我十分钟上手nx-admin
  • 算法-插入排序
  • 我的面试准备过程--容器(更新中)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ${factoryList }后面有空格不影响
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (4.10~4.16)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计ssm电影分享网站
  • (黑马C++)L06 重载与继承
  • (六)c52学习之旅-独立按键
  • (十三)Flink SQL
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)winform之ListView