Gruntjs Grunt递归动态地将标记转换为pdf

Gruntjs Grunt递归动态地将标记转换为pdf,gruntjs,Gruntjs,我一直在写一个Gruntfile,它的目标是将一堆降价文件动态转换为PDF。提供当前文件夹层次结构: root/ |_subfolder1 | |_filename1.md |_subfolder2 |_filename2.md ... |_node_modules |_subfolderN |filenameN.md 我想运行一个标记为PDF的任务,该任务将处理md文件并在同一输出目录中输出一个具有匹配文件名的PDF文件 我确实创建了一

我一直在写一个Gruntfile,它的目标是将一堆降价文件动态转换为PDF。提供当前文件夹层次结构:

root/
  |_subfolder1
  |    |_filename1.md
  |_subfolder2
       |_filename2.md
 ...
  |_node_modules
  |_subfolderN
       |filenameN.md
我想运行一个标记为PDF的任务,该任务将处理md文件并在同一输出目录中输出一个具有匹配文件名的PDF文件

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

以下是我当前的Grunfile文件:

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
          }
        }
      }
    }
  });
};
我正在使用这个插件:

所以我的问题是,我应该如何配置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');
});
};
根据,此任务使用
grunt.files
utilitary函数。这对我们来说更容易

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

也就是说,每个任务都应该接收它需要操作的文件

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

使用全局扩展的这种文件配置是最常见的配置之一。你可以找到

很明显:

在每个目录(
**
)中,从
资产/script/
中获取以
.coffee
结尾的所有内容(
/*
)。将其放入
资产/script
。将扩展名重命名为
.js

因此,您的任务可能可以这样配置:

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

你需要它成为一项繁重的任务吗?是您开发工作流程的一部分吗?你会经常做吗?也许您可以简单地编写一个节点脚本?:)是的,我希望这是一项艰巨的任务。是的,这是我开发工作流程的一部分。我想我会经常做的。我目前正在做这个任务,阅读一些关于node的书籍,在标记文件中添加一些注释,并使用自定义CSS:DOk生成干净格式的PDF,然后。。。那么,让我们这样做。等一秒钟。看看这个任务的更好的结构化方法:)我想我很接近了。谢谢!这会起作用,并且有助于理解关于grunt文件系统的一些概念。但是,我需要使用markdown的文件名(book1.md book1.PDF)创建每个PDF文件,并且在与markdown文件相同的文件夹中。在这种情况下,只需更改dest。是的,但是如何使用该结构在dest中创建变量(文件夹和文件名?
dest:'./'
就可以了。
md2pdf: {
  main: {
    files: [ {
      expand: true,
      src: ['**/*.md', '!node_modules/**/*'],
      dest: "pdf/"
    } ]
  }
}