closes #1832 The shred map (xref) builder was issuing warnings. This fix includes - Adjustments to the shredder map builder itself so that it understands, e.g., app-project relative example paths. - `**/guide/glossary.jade` now (Jade) `includes` the shared parent `glossary.jade` rather than (Harp) importing (via `partial`). This fixes `makeExample` path issues in the glossary. - Adjusted some `makeExample` paths that were ok for site build, but confused the xref tool.
		
			
				
	
	
		
			117 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * dgProcessor shredMapProcessor
 | 
						|
 * @description
 | 
						|
 *
 | 
						|
 */
 | 
						|
var path = require('canonical-path');
 | 
						|
var fs = require('fs');
 | 
						|
var _ = require('lodash');
 | 
						|
 | 
						|
module.exports = function shredMapProcessor(log, createDocMessage) {
 | 
						|
  return {
 | 
						|
    $runAfter: ['readFilesProcessor'],
 | 
						|
    $runBefore: ['rendering-docs'],
 | 
						|
 | 
						|
    $process: function(docs) {
 | 
						|
      var options = this.options;
 | 
						|
      var jadeToFragMap = {};
 | 
						|
      var fragToJadeMap = {};
 | 
						|
 | 
						|
      docs.forEach(function(doc) {
 | 
						|
        var relativePath = doc.fileInfo.relativePath;
 | 
						|
        var jadePath = path.join(options.jadeDir, relativePath);
 | 
						|
        var lang = relativePath.substr(0, relativePath.indexOf('\/'));
 | 
						|
        var appProjDirName = jadeBaseFileNameToExampleName(doc.fileInfo.baseName);
 | 
						|
        var fragInfoSet = {};
 | 
						|
        doc.fragItems.forEach(function(fragItem) {
 | 
						|
          var mixinPath = fragItem.mixinPath;
 | 
						|
          var fullExamplePath;
 | 
						|
          // Normalize mixinPath: strip out optional trailing '(...)'
 | 
						|
          var mixinPath = mixinPath.replace(/ \([^\)]*\)/,'');
 | 
						|
          if ( mixinPath.indexOf('_api') >= 0) {
 | 
						|
            var sourcePath = mixinPath.replace('_api/','');
 | 
						|
            fullExamplePath = path.join(options.apiExamplesDir, sourcePath);
 | 
						|
          } else {
 | 
						|
            fullExamplePath = path.join(options.devguideExamplesDir, mixinPath);
 | 
						|
          }
 | 
						|
          var fragInfo = makeFragInfo(options.fragmentsDir, fullExamplePath, fragItem, mixinPath);
 | 
						|
          if (!fragInfo.exists) {
 | 
						|
            var savedFragInfo = fragInfo;
 | 
						|
            // Assume that mixinPath is actually app-project-folder relative and
 | 
						|
            // prepend  "lang/appProjDirName":
 | 
						|
            var appProjRelPath = mixinPath;
 | 
						|
            mixinPath = appProjDirName + '/' + lang + '/' + mixinPath;
 | 
						|
            fragInfo = makeFragInfo(options.fragmentsDir, fullExamplePath, fragItem, mixinPath);
 | 
						|
            if (fragInfo.exists) {
 | 
						|
              log.info('Ajusted example path (' + doc.fileInfo.baseName + '): ' + appProjRelPath + ' -> ' + mixinPath);
 | 
						|
            } else {
 | 
						|
                fragInfo = savedFragInfo;
 | 
						|
            }
 | 
						|
          }
 | 
						|
          var fragPath = fragInfo.relFragPath;
 | 
						|
          fragInfoSet[fragPath] = fragInfo;
 | 
						|
          if (fragInfo.exists) {
 | 
						|
            var jadePathsSet = fragToJadeMap[fragPath];
 | 
						|
            if (!jadePathsSet) {
 | 
						|
              jadePathsSet = {};
 | 
						|
              fragToJadeMap[fragPath] = jadePathsSet;
 | 
						|
            }
 | 
						|
            jadePathsSet[jadePath] = jadePath;
 | 
						|
          } else {
 | 
						|
            var relativePath = path.relative(".", fragInfo.fragPath);
 | 
						|
            log.warn(createDocMessage('Invalid example (unable to locate fragment file: "' + relativePath + '")', doc));
 | 
						|
          }
 | 
						|
        });
 | 
						|
        jadeToFragMap[jadePath] = _.values(fragInfoSet);
 | 
						|
      });
 | 
						|
      for (var key in fragToJadeMap) {
 | 
						|
        fragToJadeMap[key] = _.keys(fragToJadeMap[key]);
 | 
						|
      }
 | 
						|
 | 
						|
      var shredMap = {
 | 
						|
        jadeToFragMap: jadeToFragMap
 | 
						|
      };
 | 
						|
 | 
						|
      if (!options.writeFilesEnabled) {
 | 
						|
        return [ shredMap ];
 | 
						|
      } else {
 | 
						|
        var newDocs = [ {
 | 
						|
          docType: 'xref-doc.json',
 | 
						|
          json: JSON.stringify(shredMap, null, 2),
 | 
						|
          outputPath: 'xref-jade.json'
 | 
						|
        }, {
 | 
						|
          docType: 'xref-jade.html',
 | 
						|
          jadeToFragMap: jadeToFragMap,
 | 
						|
          outputPath: 'xref-jade-to-frag.html'
 | 
						|
        }, {
 | 
						|
          docType: 'xref-frag.html',
 | 
						|
          fragToJadeMap: fragToJadeMap,
 | 
						|
          outputPath: 'xref-frag-to-jade.html'
 | 
						|
        }];
 | 
						|
        return newDocs;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
// TODO: use the functionality in public/resources/js/util.js once it lands.
 | 
						|
function jadeBaseFileNameToExampleName(name) {
 | 
						|
  // Adjust for known cases where chapter name is not the example name.
 | 
						|
	var matches = name.match(/(toh-)pt(\d+)/);
 | 
						|
	if (matches) name = matches[1] + matches[2];
 | 
						|
	return name;
 | 
						|
}
 | 
						|
 | 
						|
function makeFragInfo(fragmentsDir, fullExamplePath, fragItem, mixinPath) {
 | 
						|
  var region = fragItem.region ? "-" + fragItem.region : '';
 | 
						|
  var extn = path.extname(mixinPath);
 | 
						|
  var basename = path.basename(mixinPath, extn);
 | 
						|
  var fragDir = path.dirname(mixinPath);
 | 
						|
  var fragPath = path.join(fragDir, basename + region + extn) + '.md';
 | 
						|
  var fullFragPath =  path.join(fragmentsDir, fragPath);
 | 
						|
  return {
 | 
						|
    fragPath: fullFragPath,
 | 
						|
    relFragPath: fragPath,
 | 
						|
    examplePath: fullExamplePath, 
 | 
						|
    exists: fs.existsSync(fullFragPath) };
 | 
						|
} |