Grunt 递归动态地将 markdown 转换为 pdf

Grunt convert markdown to pdf recursively and dynamically

我一直在写一个 G运行tfile,它的目的是将一堆 Markdown 文件动态转换为 PDF。提供当前文件夹层次结构:

root/
  |_subfolder1
  |    |_filename1.md
  |_subfolder2
       |_filename2.md
 ...
  |_node_modules
  |_subfolderN
       |filenameN.md

我想要 运行 一个 Markdown 到 PDF 的任务,它将处理 md 文件并在同一输出目录中输出具有匹配文件名的 PDF 文件。

我确实创建了一个自定义任务,它正在解析当前目录,忽略 mode_modules 文件夹并获取降价文件,但我不知道如何配置具有良好属性的 md2pdf 任务以反映动态文件夹映射。

这是我当前的 G运行t 文件:

module.exports = function(grunt) {

  // 1 - Configuration
  grunt.initConfig({
    md2pdf: {
    }
  });

   // 2 - Plugins
  grunt.loadNpmTasks('grunt-md2pdf');

  // 3 - Task registering
  grunt.registerTask('default', 'Get Subfolders', function() {

    grunt.file.recurse('.', callback);

    function callback(abspath, rootdir, subdir, filename) {
      var filenameOutExt;

      // if current occurence is a file subdir == undefined
      // checking subdir to true means it's not undefined and
      // the current path is a directory
      if(subdir) {
        // excluding node_modules folder
        if (!subdir.match('node_modules')) {
          // only process markdown files
          if(filename.match('.md')) {
            filenameOutExt = filename.split('.')[0];
            // now for each markdown files, run md2pdf task
            // and ouput filenameOutExt.pdf in same folder
            // as the input files
          }
        }
      }
    }
  });
};

我正在使用这个插件:https://www.npmjs.com/package/grunt-md2pdf

所以我的问题是我应该如何配置 md2pdf 任务以将降价文件传递给它并在同一目录中生成匹配的文件名 pdf 输出。

输出应该是:

root/
  |_subfolder1
  |    |_filename1.md
       |_filename1.pdf
  |_subfolder2
       |_filename2.md
       |_filename2.pdf
 ...
  |_node_modules
  |_subfolderN
       |filenameN.md
       |_filenameN.pdf

非常感谢

好的,明白了!

module.exports = function(grunt) {

 // 2 - Plugins
 grunt.loadNpmTasks('grunt-md2pdf');

 grunt.registerTask('default', 'Dynamically generate PDF from MD', function() {

   grunt.file.expand("./**/*.md").forEach( function(file) {
     if(!file.match('./node_modules')) {
      var md2pdf = grunt.config.get('md2pdf') || {};
      md2pdf[file] = {
        src: file,
        dest: file + '.pdf'
      };

      grunt.config.set('md2pdf', md2pdf);
    }
  });
  grunt.task.run('md2pdf');
});
};

根据 this line,此任务使用 grunt.files 实用函数。这让我们的事情变得更容易!

首先,在 grunt 中创建不同的任务来查找您在任何其他任务中需要的文件并不常见。

也就是说,每个任务都应该收到它需要操作的文件。 For example...

coffee:
  main:
    files: [
      expand: true
      cwd: 'assets/script'
      src: ['**/*.coffee']
      dest: "assets/script"
      ext: '.js'
    ]

(请注意,此配置位于 Gruntfile.coffee 文件中,因此是 CoffeeScript 语法)

这种使用 glob 扩展 的文件配置是最常见的一种。你可以找到 details in the documentation

很明显:

In every directory (**), take everything (/*) from assets/script/ that ends with .coffee. Put it into assets/script. Rename extensions to .js.

那么,你的任务大概可以这样配置:

md2pdf: {
  main: {
    files: [ {
      expand: true,
      src: ['**/*.md', '!node_modules/**/*'],
      dest: "pdf/"
    } ]
  }
}