使用Node.js實現(xiàn)一個文章生成器
前言
本文將從零開始,講解如何使用Node.js來實現(xiàn)一個文章生成器
node里面有很多優(yōu)秀的模塊,現(xiàn)在我們就借助node的fs模塊來操控文本,來實現(xiàn)我們想要的效果
效果展示

- 體驗 fs
首先我們先創(chuàng)建一個json文件

里面放一些內容

接下來我們書寫代碼
import fs from "fs";
const data = fs.readFileSync("./cuepus/data.json", "utf-8", (err, data) => {
if (!err) {
// console.log(data);
} else {
console.log(err);
}
});

可以看到我們就能讀取到文件里的數(shù)據,這里我們體驗了fs里面強大的功能
在這里我們放了文章的一些必須點,如文章內容、標題等,通過隨機拿取數(shù)據生成一個文章

這里我們通過
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);
const url = import.meta.url;:使用了import.meta對象來獲取當前模塊文件的絕對 URL 路徑,并將其賦值給變量url。console.log(fileURLToPath(url));:將url路徑轉換為文件系統(tǒng)路徑console.log(dirname(fileURLToPath(url)));:將url轉換為文件系統(tǒng)路徑,然后通過dirname函數(shù)獲取該路徑的目錄部分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));
接下來我們寫封裝兩個函數(shù)
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 - 1
const index = randomInt(0, len);
[arr[index], arr[len]] = [arr[len], arr[index]]
return arr[index]
}
randomPick() // 放棄第一次結果
return randomPick
}
首先,定義了一個名為 randomInt 的導出函數(shù),它接受兩個參數(shù) min 和 max ,用于生成指定范圍內的隨機整數(shù)。
然后,定義了一個名為 createRandomPicker 的導出函數(shù),它接受一個數(shù)組 arr 作為參數(shù)。
在函數(shù)內部,先對傳入的數(shù)組進行了復制,以避免修改原始數(shù)組。
接著,定義了一個內部函數(shù) randomPick ,它的功能是:
- 計算數(shù)組的有效長度。
- 生成一個在有效范圍內的隨機索引。
- 通過交換將隨機索引處的元素與最后一個元素交換位置。
- 返回交換后的隨機索引處的元素。
在函數(shù)體中,首先調用了一次 randomPick 函數(shù),但放棄了這次的結果。
最后,返回 randomPick 函數(shù),以便外部可以調用它來獲取隨機抽取的數(shù)組元素。
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 } = corpus
const [pickFamous, pickBoshBefore, pickBosh, pickConclude, pickSaid]
= [famous, bosh_before, bosh, conclude, said].map(createRandomPicker)
const article = []
let totalLength = 0
while (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.length
article.push(section)
}
return article
}
從 './random.js' 模塊導入了 randomInt 和 createRandomPicker 兩個函數(shù)。
然后,定義了 sentence 函數(shù),它接受兩個參數(shù) pick 和 replacer 。
pick 函數(shù)用于獲取一個句子,然后通過遍歷 replacer 對象中的鍵,使用正則表達式匹配并替換句子中特定的模板字符串(形如 {{key}} )。如果對應的值是函數(shù),則調用函數(shù)獲取結果進行替換,否則直接使用值進行替換。
接下來,定義了 generate 函數(shù),它接受三個參數(shù):title 、一個包含配置信息的對象(包含 corpus 以及可選的 min 和 max )。
在函數(shù)內部:
- 通過
randomInt生成一個在min和max范圍內的文章長度articleLenth。 - 從
corpus對象中解構出幾個部分,并對每個部分使用createRandomPicker函數(shù)創(chuàng)建隨機選擇器。 - 通過一個循環(huán)生成文章內容,每次循環(huán)生成一個段落。在生成段落的過程中,根據隨機數(shù)決定使用不同的句子生成方式,并通過
sentence函數(shù)進行處理和組合。 - 不斷累加段落的長度,直到總長度達到
articleLenth,最終將生成的文章段落組成一個數(shù)組返回。
最后調用即可,修改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來實現(xiàn)一個文章生成器
希望看到這里的你能夠有所收獲?。。。∽约簞邮謱崿F(xiàn)一個簡易的文章生成器吧
后期可以結合AI去實現(xiàn)更加智能的文章生成器
到此這篇關于使用Node.js實現(xiàn)一個文章生成器的文章就介紹到這了,更多相關Node.js文章生成器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pnpm實現(xiàn)依賴包共享和依賴包項目隔離的方法詳解
pnpm是Node.js的包管理器,它是 npm 的直接替代品,相對于npm和yarn它的優(yōu)點就在于速度快和高效節(jié)省磁盤空間,本文主要講解pnpm相比于npm/yarn如何利用軟硬鏈接來節(jié)省磁盤空間,以及如何實現(xiàn)依賴包共享和依賴包項目隔離的,需要的朋友可以參考下2024-05-05
nodejs+express實現(xiàn)文件上傳下載管理網站
這篇文章主要為大家詳細介紹了nodejs+express實現(xiàn)文件上傳下載管理的網站,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03

