아래식에서 readdir 메소드 부분은 수정할 필요가 있다.
비동기 메소드를 사용해서 불필요한 식과 식의 순서가 약간 어그러져있다.
const {src, dest} = require('gulp');
const fs = require('fs');
const path = require('path');
const cheerio = require('cheerio');
const ejs = require('gulp-ejs');
const getRepoInfo = require('git-repo-info');
function make_indexfile(done) {
// git 정보를 info 상수에 담는다.
const info = getRepoInfo();
// 파일 정보를 저장할 배열 생성
let normalFiles = [];
fs.readdir('./src/html/', function (err, files) {
if (err) {
throw err;
}
files.map(function (file) {
// console.log(`./src/html/${file}`);
// console.log(path.join('./src/html', file));
// 현재 html 파일들의 경로와 파일명을 합쳐서 다음 함수로 전달한다.
return path.join('./src/html', file);
}).filter(function (file) {
// console.log(fs.statSync(file));
// console.log(fs.statSync(file).isFile());
// 전달 받은 파일경로+파일명들이 파일인지 아닌지 구분하여 아닌 것들은 걸러낸다.
return fs.statSync(file).isFile();
}).forEach(function (file) {
// 넘어온 파일들의 목록의 상태 목록들을 stats 상수에 저장한다.
// https://psyhm.tistory.com/15
const stats = fs.statSync(file);
// 넘어온 파일들의 확장자 목록들을 extname 상수에 저장한다.
const extname = path.extname(file);
// 넘어온 파일목록의 파일명+확장자 목록을 basename 상수에 저장한다.
const basename = path.basename(file);
// 확장자가 html 이라면
if (extname === '.html') {
// 일반 file info를 저장할 변수 nfileData를 생성한다. 객체형
let nfileData = {};
// 각 파일의 내용을 fileInnerText 상수에 저장한다.
const fileInnerText = fs.readFileSync(file, 'utf8');
// cheerio 모듈 - html 파일 편집을 도와주는 모듈이다.
// 각 파일의 내용들을 담은 상수 fileInnerText를 로드해 $ 변수에 저장한다.
const $ = cheerio.load(fileInnerText);
// title 태그 안에 text들을 wholeTitle에 저장한다.
const wholeTitle = $('title').text();
// : 콜론을 기준으로 쪼개서 splitTitle 상수에 배열 형태로 저장한다.
const splitTitle = wholeTitle.split(' : ');
// 객체에 데이터 집어넣기
// nfileData 객체의 title 키에 splitTitle 첫번째 요소를 대입한다.
// trim 메서드는 앞뒤로 공백을 없애준다.
nfileData.title = splitTitle[0].trim();
// nfileData 객체의 name 키에 file의 베이스이름(파일명+확장자, 경로제외)을 저장한다.
nfileData.name = path.basename(file);
// nfileData 객체의 name 키에 저장된 문자열 데이터에서 첫번째 글자부터 두번째 글자까지 잘라서 category 키값에 저장한다.
nfileData.category = nfileData.name.substring(0, 2);
// nfileData 객체의 categoryText 키에 splitTitle 두번째 요소를 대입한다.
// trim 메서드는 앞뒤로 공백을 없애준다.
nfileData.categoryText = splitTitle[1].trim();
// 마지막 수정시간을 nfileData 객체의 mdate 키에 담는다.
// mtile = modification date
nfileData.mdate = new Date(stats.mtime);
// 마지막 파일수정시점을 ndate 키에 담는다. - 대한민국 표준시 기준
nfileData.ndate = nfileData.mdate.toLocaleString('ko-KR',{timeZone:'Asia/Seoul'})+' (GMT+9)';
// 브랜치 정보를 branch 키에 담는다.
nfileData.branch = info.branch
// title 마지막 조각 , 인덱스에 붙은 라벨 식별 및 yet 인 경우 수정날짜정보 제거
nfileData.status = splitTitle[2];
if(typeof splitTitle[2] == 'undefined' || splitTitle[2] == null || splitTitle[2] == '') {
nfileData.status = '';
}
else if(splitTitle[2] == 'yet') {
nfileData.mdate = '';
nfileData.ndate = '';
}
normalFiles.push(nfileData);
}
})
const projectObj = {
nfiles: normalFiles
}
// projectObj, normalFiles 키값에 다른 유형의 데이터가 있기 때문에 아래처럼 문자열 데이터로 변형한 후 projectObjStr 상수에 담는다.
const projectObjStr = JSON.stringify(projectObj);
// 문자열화된 데이터를 다시 JSON 객체화시켜서 projectObjJson 상수에 담는다.
// 이렇게해야 마지막 수정시간으로 저장된 mdate 의 value가 문자열로 JSON 객체화돼서 ejs와 연동시킬 수 있다.
const projectObjJson = JSON.parse(projectObjStr);
console.log(projectObjJson)
//index 파일 쓰기
// return src('index.html')
// .pipe(ejs(projectObjJson))
// .pipe(dest('./dist/'))
});
// 아래 done 함수는 매개변수에서 전달받은 함수를 실행시킨 것이다.
// 보통 이렇게 작성하면 done 매개변수로 받는 인자값이 아무것도 없기 때문에 정의가 안되었다는 에러가 발생한다.
// 하지만 gulp에선 아래와 같이 쓰면 함수가 끝났다는 것을 알려준다.
// gulp에 내재되어있는 기능 중 한개같다.
// https://stackoverflow.com/questions/29298244/gulp-where-is-the-gulp-task-callback-function-defined
// 더 알아보니 이렇게 모듈로 타고타고 들어가서 처리된다는 것을 알 수 있었다.
// 신기하다. 아래 done() 은 함수가 끝났는지 안끝났는지 여부만 알려주고 그이상 그이하도 아니다.
// done();
}
// exports.default = make_indexfile;
make_indexfile();