List Fonts Used in PSD File - Adobe.js | JavaScript: Behavioral Layer

Standards Based Development

List All Fonts Used in psd Files JSX Script:


function main(){ 
Stdlib = function Stdlib() {}; 
Stdlib.findFiles = function(folder, mask) {//from Xbytor's Xtools 
     var files = Stdlib.getFiles(folder, mask); 
     var folders = Stdlib.getFolders(folder); 

     for (var i = 0; i < folders.length; i++) { 
       var f = folders[i]; 
       var ffs = Stdlib.findFiles(f, mask); 
       while (ffs.length > 0) { 
         files.push(ffs.shift()); 
       } 
     } 
     return files; 
   }; 

   Folder.prototype.findFiles = function(mask) { 
     return Stdlib.findFiles(this, mask); 
   }; 
   Stdlib.getFiles = function(folder, mask) { 
  var files = []; 
  var getF; 
  if (Folder.prototype._getFiles) { 
    getF = function(f, m) { return f._getFiles(m); } 
  } else { 
    getF = function(f, m) { return f.getFiles(m); } 
  } 

  if (mask instanceof RegExp) { 
    var allFiles = getF(folder); 
    for (var i = 0; i < allFiles.length; i = i + 1) { 
      var f = allFiles[i]; 
      if (decodeURI(f.absoluteURI).match(mask)) { 
        files.push(f); 
      } 
    } 
  } else if (typeof mask == "function") { 
    var allFiles = getF(folder); 
    for (var i = 0; i < allFiles.length; i = i + 1) { 
      var f = allFiles[i]; 
      if (mask(f)) { 
        files.push(f); 
      } 
    } 
  } else { 
    files = getF(folder, mask); 
  } 

  return files; 
}; 
Stdlib.getFolders = function(folder) { 
  return Stdlib.getFiles(folder, function(file) { 
                           return file instanceof Folder; }); 
} 
    
function getDocFonts(){ 
function traverseLayers (doc, ftn, reverse) { //from Xbytor 

  function _traverse(doc, layers, ftn, reverse) { 
    var ok = true; 
    for (var i = 1; i <= layers.length && ok != false; i++) { 
      var index = (reverse == true) ? layers.length-i : i - 1; 
      var layer = layers[index]; 

      if (layer.typename == "LayerSet") { 
        ok = _traverse(doc, layer.layers, ftn, reverse); 
      } else { 
        ok = ftn(doc, layer); 
      } 
    } 
    return ok; 
  }; 

  return _traverse(doc, doc.layers, ftn, reverse); 
}; 
function getLayersList(doc, reverse) { 
  function _ftn(doc, layer) { 

   if(layer.kind == LayerKind.TEXT){ _ftn.list.push(layer);}; 
  }; 

  _ftn.list = []; 
  traverseLayers(doc, _ftn, reverse); 

  return _ftn.list; 
}; 
Array.prototype.add = function(obj) { //from Andrew Hall 
   if (this.toString().search(RegExp("(?:^|,)" + obj.toString() + "(?:$|,)")) == -1) this.push(obj); 
}; 
function getFontInfo(){ 
   var info = new Array; 
   var ref = new ActionReference(); 
      ref.putEnumerated( stringIDToTypeID( "layer" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" )); 
   var desc= executeActionGet( ref ) 
   var list =  desc.getObjectValue(charIDToTypeID("Txt ")) ; 
   var tsr =  list.getList(charIDToTypeID("Txtt")) ; 
   for(var i = 0;i<tsr.count;i++){ 
      var tsr0 =  tsr.getObjectValue(i) ;  
      var textStyle = tsr0.getObjectValue(charIDToTypeID("TxtS")); 
      var font = textStyle.getString(charIDToTypeID("FntN" )); 
      var style = textStyle.getString(charIDToTypeID( "FntS" )); 
      font = font+"-"+style; 
        info.add(font); 
         } 
   return info; 
}; 

    
var doc = app.activeDocument; 
var allLayers = getLayersList(doc); 
if (allLayers.length>0){ 
   var allFonts = new Array; 
   for(var i = 0;i<allLayers.length;i++){
       if(allLayers[i].kind == LayerKind.TEXT){ 
        app.activeDocument.activeLayer = allLayers[i]; 
        allFonts.add(getFontInfo());
      } 
     }; 
   } 
return allFonts; 
}; 


var listOfFonts =  new Array; 
var selectedFolder = Folder.selectDialog( "Please select the input folder", Folder( "~" ) ); 
if(selectedFolder == null) return; 
var psdFiles = selectedFolder.findFiles(/\.psd$|\.PSD$/); 
   for(var i = 0;i < psdFiles.length; i++){ 
      var doc = open(psdFiles[i]); 
      var test = getDocFonts(); 
      if(test != undefined){ 
         listOfFonts.push([psdFiles[i].name,test]) 
      }; 
      doc.close(SaveOptions.DONOTSAVECHANGES); 
   }; 
    
var f = new File(selectedFolder+"/fonts.txt") ; 
if (!f.open("w")) { 
    throw "Unable to open file: " + f.error; 
}; 
f.writeln("File,Fonts"); 
var fullList = new Array; 
for(var i = 0;i<listOfFonts.length;i++){ 
   f.writeln(listOfFonts[i]); 
   if(listOfFonts[i][1].length == 1){ 
      fullList.add(listOfFonts[i][1]); 
   }else{ 
      for(var idx = 0; idx<listOfFonts[i][1].length;idx++){ 
         fullList.add(listOfFonts[i][1][idx].shift()); 
      }; 
   };    
}; 
f.writeln(); 
f.writeln("List of fonts used in all documents") 
fullList.sort(); 
for(var i = 0;i<fullList.length;i++){ 
   f.writeln(fullList[i]); 
   }; 
f.close(); 
}; 
main();