const fs = require('fs-extra'); const unified = require('unified'); const parse = require('remark-parse'); const parse2 = require('rehype-parse'); const rehype = require('remark-rehype'); const stringify = require('rehype-stringify'); const stringify2 = require('remark-stringify'); const remark = require('rehype-remark'); const path = require('path'); const readDirP = require('readdirp-walk'); const { Translate } = require('@google-cloud/translate'); const lang = 'es'; const langFull = 'spanish'; const mdProcessor = unified() .use(parse) .use(rehype, { allowDangerousHTML: true }) .use(stringify); const htmlProcessor = unified() .use(parse2) .use(remark) .use(stringify2); readDirP({ root: path.resolve(__dirname, `./test`) }) .on('data', translateChallenge); async function translateChallenge(file) { const { name, depth, path: filePath, fullPath, fullParentDir, stat } = file; if (stat.isDirectory() || name === '.DS_Store' || file.depth == 1) return null; const pathIndex = fullPath.indexOf('guide') + 6; const outputDir = fullParentDir.substring(0, pathIndex) + `${langFull}/` + fullParentDir.substring(pathIndex + 5); const outputPath = fullPath.substring(0, pathIndex) + `${langFull}/` + fullPath.substring(pathIndex + 5); if (fs.existsSync(outputPath)) return null; fs.ensureDirSync(outputDir); const fileString = fs.readFileSync(fullPath).toString(); var i = fileString.indexOf('---', 4) const meta = fileString.substring(0, i+4) const title = fileString.split('\n')[1].split(': ')[1]; var article = fileString.substring(i+4) mdToHtml(article).then((htmlArticle) => { htmlArticle = htmlArticle.replace(/\n/g, '
') htmlArticle = htmlArticle.replace(/ /g, '        ') htmlArticle = htmlArticle.replace(/ /g, '    ') htmlArticle = htmlArticle.replace(/ /g, '  ') translate(htmlArticle, title, meta, outputPath); }) } function translate(htmlArticle, title, meta, outputPath) { Promise.all([ translateText(title), translateText(htmlArticle) ]).then(function(translations) { // Replace English with translation let translatedTitle = translations[0][0]; let tempArticle = translations[1][0] tempArticle = tempArticle.replace(/
/g, '\n') tempArticle = tempArticle.replace(/'/g, `'`) // tempArticle = tempArticle.replace(/language-html">/g, 'language-html">\n') // tempArticle = tempArticle.replace(/
  <\/pre/g, ' {
            const i = meta.indexOf('---', 4);
            let translatedFile = meta.slice(0, i) + `localeTitle: ${translatedTitle}\n` + meta.slice(i) + translatedArticle;
            writeFile(translatedFile, outputPath);
        });
      });
}

const createTranslateText = target => (text) => {
    if (!text) return '';
    const translate = new Translate();
    
    return translate
        .translate(text, target)
        .then(results => {
        let translations = results[0];
        translations = Array.isArray(translations) ?
            translations : [translations];
        return translations;
        })
        .catch(err => {
        console.log(err);
        });
}
    
const translateText = createTranslateText(lang);


function writeFile(fileString, outputPath) {
    fs.writeFile(outputPath, fileString, function(err) {
        if (err) throw err;
        console.log('Saved:' + outputPath);
      });
}

function mdToHtml(file) {
    return new Promise((resolve, reject) =>
      mdProcessor.process(file, function(err, file) {
        if (err) {
          reject(err);
        }
        return resolve(file.contents);
      })
    );
  };
  
  function htmlToMd(file) {
      return new Promise((resolve, reject) =>
        htmlProcessor.process(file, function(err, file) {
          if (err) {
            reject(err);
          }
          return resolve(file.contents);
        })
      );
    };