LHJ

I'm a FE developer.

NodeJS File System 모듈 관련

18 May 2020 » node_module

아래식에서 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();