namesny-com/src/utils/scanner.js

129 lines
2.9 KiB
JavaScript

import fs from 'fs'
import path from 'path'
import config from '../../config/config.json'
import fm from 'front-matter'
import moment from 'moment'
import jsonfile from 'jsonfile'
export class Scanner {
constructor () {
this.data = {
'posts': [],
'other': {}
}
}
readdir (dirname) {
return new Promise((resolve, reject) => {
fs.readdir(dirname, function (err, filenames) {
if (err) {
reject(err)
} else {
resolve(filenames)
}
})
})
}
readfile (filename) {
const filePath = path.join(process.cwd(), config.contentPath, filename)
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err)
} else {
resolve([filename, data])
}
})
})
}
processFile (file, data) {
const filePath = path.join(process.cwd(), config.contentPath, file)
const metadata = this.fileMetadata(filePath)
if (config['non-content-files'].indexOf(file) === -1) {
const frontMatter = fm(data)
if (frontMatter.attributes.draft) {
return
}
let published
if (frontMatter.attributes.date) {
published = moment(frontMatter.attributes.date)
} else {
published = moment()
}
const post = {
published: published.format('MMMM DD, YYYY'),
filename: metadata.filename,
title: frontMatter.attributes.title,
link: '/post/' + metadata.filename
}
this.data.posts.push(post)
} else {
this.data.other[metadata.filename] = data
}
}
// init () {
// return new Promise((resolve, reject) => {
// jsonfile.readFile(config.dataPath, (err, data) => {
// if (err) {
// reject(err)
// } else {
// this.data = data
// resolve(data)
// }
// })
// })
// }
writeData (callback) {
return new Promise((resolve, reject) => {
jsonfile.writeFile(config.dataPath, this.data, (err, data) => {
if (err) {
reject(err)
} else {
resolve(this.data)
}
})
})
}
fileMetadata (filepath) {
const paths = filepath.split('/')
const basename = path.basename(filepath)
const metadata = {
basename,
filename: basename.substr(0, basename.lastIndexOf('.')),
parrent: paths[paths.length - 2],
dirname: path.dirname(filepath)
}
return metadata
}
scan () {
this.readdir(config.contentPath)
.then(
(files) => { return Promise.all(files.map(this.readfile)) }
).then(
(files) => {
files.forEach(
(item) => { this.processFile(item[0], item[1]) }
)
return this.writeData()
}
).then(
console.log('[Scanner] Scan complete')
).catch(
(err) => console.log(err)
)
}
}