Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Help me edit an InDesign sample Javascript

Guest
Jan 28, 2015 Jan 28, 2015

Hi, There is a sample InDesign JavaScript called ImageCatalog.jsx, I would like to edit it so that it only searches for and lays out images with a given prefix, so instead of returning all of the images in the directory, I would like to specify a set PREFIX such as the number "100" or the word "apple". Can someone please help me out?

Here is the entire script.

//ImageCatalog.jsx

//An InDesign CS6 JavaScript

/* 

@@@BUILDINFO@@@ "ImageCatalog.jsx" 3.0.0 15 December 2009

*/

//Creates an image catalog from the graphic files in a selected folder.

//Each file can be labeled with the file name, and the labels are placed on

//a separate layer and formatted using a paragraph style ("label") you can

//modify to change the appearance of the labels.

//

//For more information on InDesign scripting, go to http://www.adobe.com/products/indesign/scripting/index.html

//Or visit the InDesign Scripting User to User forum at http://www.adobeforums.com .

//

//The myExtensions array contains the extensions of the graphic file types you want

//to include in the catalog. You can remove extensions from or add extensions to this list.

//myExtensions is a global. Mac OS users should also look at the file types in the myFileFilter function.

main();

function main(){

  var myFilteredFiles;

  //Make certain that user interaction (display of dialogs, etc.) is turned on.

  app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

  myExtensions = [".jpg", ".jpeg", ".eps", ".ps", ".pdf", ".tif", ".tiff", ".gif", ".psd", ".ai"]

   

   

  //Display the folder browser.

    var myFolder = Folder.selectDialog("Select the folder containing the images", "");

   

    //******This is what i will be replacinf it with instaed of the line above , as i have a fixed  directory *************.

  //var myFolder = Folder("/Volumes/Creative_Working/Universal/PRODUCT%20KNOWLEDGE%20IMAGES/FY15/");

   

   

  //Get the path to the folder containing the files you want to place.

  if(myFolder != null){

  if(File.fs == "Macintosh"){

  myFilteredFiles = myMacOSFileFilter(myFolder);

  }

  else{

  myFilteredFiles = myWinOSFileFilter(myFolder);

  }

  if(myFilteredFiles.length != 0){

  myDisplayDialog(myFilteredFiles, myFolder);

  alert("Done!");

  }

  }

}

//Windows version of the file filter.

function myWinOSFileFilter(myFolder){

  var myFiles = new Array;

  var myFilteredFiles = new Array;

  for(myExtensionCounter = 0; myExtensionCounter < myExtensions.length; myExtensionCounter++){

  myExtension = myExtensions[myExtensionCounter];

        myFiles = myFolder.getFiles("*"+ myExtension);

  if(myFiles.length != 0){

  for(var myFileCounter = 0; myFileCounter < myFiles.length; myFileCounter++){

  myFilteredFiles.push(myFiles[myFileCounter]);

  }

  }

  }

  return myFilteredFiles;

}

function myMacOSFileFilter(myFolder){

  var myFilteredFiles = myFolder.getFiles(myFileFilter);

  return myFilteredFiles;

}

//Mac OS version of file filter

//Have to provide a separate version because not all Mac OS users use file extensions

//and/or file extensions are sometimes hidden by the Finder.

function myFileFilter(myFile){

  var myFileType = myFile.type;

  switch (myFileType){

  case "JPEG":

  case "EPSF":

  case "PICT":

  case "TIFF":

  case "8BPS":

  case "GIFf":

  case "PDF ":

  return true;

  break;

  default:

  for(var myCounter = 0; myCounter<myExtensions.length; myCounter++){

  var myExtension = myExtensions[myCounter];

  if(myFile.name.indexOf(myExtension)>-1){

  return true;

  break;

  }

  }

  }

  return false;

}

function myDisplayDialog(myFiles, myFolder){

  var myLabelWidth = 112;

  var myStyleNames = myGetParagraphStyleNames(app);

  var myLayerNames = ["Layer 1", "Labels"];

  var myDialog = app.dialogs.add({name:"Image Catalog"});

  with(myDialog.dialogColumns.add()){

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Information:"});

  }

  with(borderPanels.add()){

  with(dialogColumns.add()){

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Source Folder:", minWidth:myLabelWidth});

  staticTexts.add({staticLabel:myFolder.path + "/" + myFolder.name});

  }

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Number of Images:", minWidth:myLabelWidth});

  staticTexts.add({staticLabel:myFiles.length + ""});

  }

  }

  }

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Options:"});

  }

  with(borderPanels.add()){

  with(dialogColumns.add()){

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Number of Rows:", minWidth:myLabelWidth});

  var myNumberOfRowsField = integerEditboxes.add({editValue:3});

  }

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Number of Columns:", minWidth:myLabelWidth});

  var myNumberOfColumnsField = integerEditboxes.add({editValue:3});

  }

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Horizontal Offset:", minWidth:myLabelWidth});

  var myHorizontalOffsetField = measurementEditboxes.add({editValue:12, editUnits:MeasurementUnits.points});

  }

  with(dialogRows.add()){

  staticTexts.add({staticLabel:"Vertical Offset:", minWidth:myLabelWidth});

  var myVerticalOffsetField = measurementEditboxes.add({editValue:24, editUnits:MeasurementUnits.points});

  }

  with (dialogRows.add()){

  with(dialogColumns.add()){

  staticTexts.add({staticLabel:"Fitting:", minWidth:myLabelWidth});

  }

  with(dialogColumns.add()){

  var myFitProportionalCheckbox = checkboxControls.add({staticLabel:"Proportional", checkedState:true});

  var myFitCenterContentCheckbox = checkboxControls.add({staticLabel:"Center Content", checkedState:true});

  var myFitFrameToContentCheckbox = checkboxControls.add({staticLabel:"Frame to Content", checkedState:true});

  }

  }

  with(dialogRows.add()){

  var myRemoveEmptyFramesCheckbox = checkboxControls.add({staticLabel:"Remove Empty Frames:", checkedState:true});

  }

  }

  }

  with(dialogRows.add()){

  staticTexts.add({staticLabel:""});

  }

  var myLabelsGroup = enablingGroups.add({staticLabel:"Labels", checkedState:true});

  with (myLabelsGroup){

  with(dialogColumns.add()){

  //Label type

  with(dialogRows.add()){

  with(dialogColumns.add()){

  staticTexts.add({staticLabel:"Label Type:", minWidth:myLabelWidth});

  }

  with(dialogColumns.add()){

  var myLabelTypeDropdown = dropdowns.add({stringList:["File name", "File path", "XMP description", "XMP author"], selectedIndex:0});

  }

  }

  //Text frame height

  with(dialogRows.add()){

  with(dialogColumns.add()){

  staticTexts.add({staticLabel:"Label Height:", minWidth:myLabelWidth});

  }

  with(dialogColumns.add()){

  var myLabelHeightField = measurementEditboxes.add({editValue:24, editUnits:MeasurementUnits.points});

  }

  }

  //Text frame offset

  with(dialogRows.add()){

  with(dialogColumns.add()){

  staticTexts.add({staticLabel:"Label Offset:", minWidth:myLabelWidth});

  }

  with(dialogColumns.add()){

  var myLabelOffsetField = measurementEditboxes.add({editValue:0, editUnits:MeasurementUnits.points});

  }

  }

  //Style to apply

  with(dialogRows.add()){

  with(dialogColumns.add()){

  staticTexts.add({staticLabel:"Label Style:", minWidth:myLabelWidth});

  }

  with(dialogColumns.add()){

  var myLabelStyleDropdown = dropdowns.add({stringList:myStyleNames, selectedIndex:0});

  }

  }

  //Layer

  with(dialogRows.add()){

  with(dialogColumns.add()){

  staticTexts.add({staticLabel:"Layer:", minWidth:myLabelWidth});

  }

  with(dialogColumns.add()){

  var myLayerDropdown = dropdowns.add({stringList:myLayerNames, selectedIndex:0});

  }

  }

  }

  }

        var myResult = myDialog.show();

        if(myResult == true){

  var myNumberOfRows = myNumberOfRowsField.editValue;

  var myNumberOfColumns = myNumberOfColumnsField.editValue;

  var myRemoveEmptyFrames = myRemoveEmptyFramesCheckbox.checkedState;

  var myFitProportional = myFitProportionalCheckbox.checkedState;

  var myFitCenterContent = myFitCenterContentCheckbox.checkedState;

  var myFitFrameToContent = myFitFrameToContentCheckbox.checkedState;

  var myHorizontalOffset = myHorizontalOffsetField.editValue;

  var myVerticalOffset = myVerticalOffsetField.editValue;

  var myMakeLabels = myLabelsGroup.checkedState;

  var myLabelType = myLabelTypeDropdown.selectedIndex;

  var myLabelHeight = myLabelHeightField.editValue;

  var myLabelOffset = myLabelOffsetField.editValue;

  var myLabelStyle = myStyleNames[myLabelStyleDropdown.selectedIndex];

  var myLayerName = myLayerNames[myLayerDropdown.selectedIndex];

  myDialog.destroy();

  myMakeImageCatalog(myFiles, myNumberOfRows, myNumberOfColumns, myRemoveEmptyFrames, myFitProportional, myFitCenterContent, myFitFrameToContent, myHorizontalOffset, myVerticalOffset, myMakeLabels, myLabelType, myLabelHeight, myLabelOffset, myLabelStyle,  myLayerName);

        }

  else{

  myDialog.destroy();

  }

  }

}

function myGetParagraphStyleNames(myDocument){

  var myStyleNames = new Array;

  var myAddLabelStyle = true;

  for(var myCounter = 0; myCounter < myDocument.paragraphStyles.length; myCounter++){

  myStyleNames.push(myDocument.paragraphStyles.item(myCounter).name);

  if (myDocument.paragraphStyles.item(myCounter).name == "Labels"){

  myAddLabelStyle = false;

  }

  }

  if(myAddLabelStyle == true){

  myStyleNames.push("Labels");

  }

  return myStyleNames;

}

function myMakeImageCatalog(myFiles, myNumberOfRows, myNumberOfColumns, myRemoveEmptyFrames, myFitProportional, myFitCenterContent, myFitFrameToContent, myHorizontalOffset, myVerticalOffset, myMakeLabels, myLabelType, myLabelHeight, myLabelOffset, myLabelStyle,  myLayerName){

  var myPage, myFile, myCounter, myX1, myY1, myX2, myY2, myRectangle, myLabelStyle, myLabelLayer;

  var myParagraphStyle, myError;

  var myFramesPerPage = myNumberOfRows * myNumberOfColumns; 

  var myDocument = app.documents.add();

  myDocument.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points;

  myDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.points;

  var myDocumentPreferences = myDocument.documentPreferences; 

  var myNumberOfFrames = myFiles.length;

  var myNumberOfPages = Math.round(myNumberOfFrames / myFramesPerPage);

  if ((myNumberOfPages * myFramesPerPage) < myNumberOfFrames){ 

  myNumberOfPages++;

  }

  //If myMakeLabels is true, then add the label style and layer if they do not already exist.

  if(myMakeLabels == true){

  try{

  myLabelLayer = myDocument.layers.item(myLayerName);

  //if the layer does not exist, trying to get the layer name will cause an error.

  myLabelLayer.name;

  }

  catch (myError){

  myLabelLayer = myDocument.layers.add({name:myLayerName});

  }

  //If the paragraph style does not exist, create it.

  try{

  myParagraphStyle = myDocument.paragraphStyles.item(myLabelStyle);

  myParagraphStyle.name;

  }

  catch(myError){

  myDocument.paragraphStyles.add({name:myLabelStyle});

  }

  }

  myDocumentPreferences.pagesPerDocument = myNumberOfPages; 

  myDocumentPreferences.facingPages = false; 

  var myPage = myDocument.pages.item(0); 

  var myMarginPreferences = myPage.marginPreferences;

  var myLeftMargin = myMarginPreferences.left; 

  var myTopMargin = myMarginPreferences.top; 

  var myRightMargin = myMarginPreferences.right; 

  var myBottomMargin = myMarginPreferences.bottom; 

  var myLiveWidth = (myDocumentPreferences.pageWidth - (myLeftMargin + myRightMargin)) + myHorizontalOffset

  var myLiveHeight = myDocumentPreferences.pageHeight - (myTopMargin + myBottomMargin)

  var myColumnWidth = myLiveWidth / myNumberOfColumns

  var myFrameWidth = myColumnWidth - myHorizontalOffset

  var myRowHeight = (myLiveHeight / myNumberOfRows)

  var myFrameHeight = myRowHeight - myVerticalOffset

  var myPages = myDocument.pages;

  // Construct the frames in reverse order. Don't laugh--this will 

  // save us time later (when we place the graphics). 

  for (myCounter = myDocument.pages.length-1; myCounter >= 0; myCounter--){ 

  myPage = myPages.item(myCounter);

  for (var myRowCounter = myNumberOfRows; myRowCounter >= 1; myRowCounter--){ 

  myY1 = myTopMargin + (myRowHeight * (myRowCounter-1));

  myY2 = myY1 + myFrameHeight;

  for (var myColumnCounter = myNumberOfColumns; myColumnCounter >= 1; myColumnCounter--){ 

  myX1 = myLeftMargin + (myColumnWidth * (myColumnCounter-1));

  myX2 = myX1 + myFrameWidth;

  myRectangle = myPage.rectangles.add(myDocument.layers.item(-1), undefined, undefined, {geometricBounds:[myY1, myX1, myY2, myX2], strokeWeight:0, strokeColor:myDocument.swatches.item("None")}); 

  }

  }

  }

  // Because we constructed the frames in reverse order, rectangle 1 

  // is the first rectangle on page 1, so we can simply iterate through 

  // the rectangles, placing a file in each one in turn. myFiles = myFolder.Files; 

  for (myCounter = 0; myCounter < myNumberOfFrames; myCounter++){ 

  myFile = myFiles[myCounter]; 

  myRectangle = myDocument.rectangles.item(myCounter);

  myRectangle.place(File(myFile));

  myRectangle.label = myFile.fsName.toString();

  //Apply fitting options as specified.

  if(myFitProportional){

  myRectangle.fit(FitOptions.proportionally);

  }

  if(myFitCenterContent){

  myRectangle.fit(FitOptions.centerContent);

  }

  if(myFitFrameToContent){

  myRectangle.fit(FitOptions.frameToContent);

  }

  //Add the label, if necessary.

  if(myMakeLabels == true){

  myAddLabel(myRectangle, myLabelType, myLabelHeight, myLabelOffset, myLabelStyle, myLayerName);

  }

  }

  if (myRemoveEmptyFrames == 1){ 

  for (var myCounter = myDocument.rectangles.length-1; myCounter >= 0;myCounter--){ 

  if (myDocument.rectangles.item(myCounter).contentType == ContentType.unassigned){

  myDocument.rectangles.item(myCounter).remove();

  } 

  else{

  //As soon as you encounter a rectangle with content, exit the loop.

  break;

  }

  }

  }

}

//Function that adds the label.

function myAddLabel(myFrame, myLabelType, myLabelHeight, myLabelOffset, myLabelStyleName, myLayerName){

  var myDocument = app.documents.item(0);

  var myLabel;

  var myLabelStyle = myDocument.paragraphStyles.item(myLabelStyleName);

  var myLabelLayer = myDocument.layers.item(myLayerName);

  var myLink =myFrame.graphics.item(0).itemLink;

  //Label type defines the text that goes in the label.

  switch(myLabelType){

  //File name

  case 0:

  myLabel = myLink.name;

  break;

  //File path

  case 1:

  myLabel = myLink.filePath;

  break;

  //XMP description

  case 2:

  try{

  myLabel = myLink.linkXmp.description;

  if(myLabel.replace(/^\s*$/gi, "")==""){

  throw myError;

  }

  }

  catch(myError){

  myLabel = "No description available.";

  }

  break;

  //XMP author

  case 3:

  try{

  myLabel = myLink.linkXmp.author

  if(myLabel.replace(/^\s*$/gi, "")==""){

  throw myError;

  }

  }

  catch(myError){

  myLabel = "No author available.";

  }

  break;

  }

  var myX1 = myFrame.geometricBounds[1];

  var myY1 = myFrame.geometricBounds[2] + myLabelOffset;

  var myX2 = myFrame.geometricBounds[3];

  var myY2 = myY1 + myLabelHeight;

  var myTextFrame = myFrame.parent.textFrames.add(myLabelLayer, undefined, undefined,{geometricBounds:[myY1, myX1, myY2, myX2], contents:myLabel});

  myTextFrame.textFramePreferences.firstBaselineOffset = FirstBaseline.leadingOffset;

  myTextFrame.parentStory.texts.item(0).appliedParagraphStyle = myLabelStyle;

}

TOPICS
Scripting
861
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Valorous Hero ,
Jan 28, 2015 Jan 28, 2015

Haven't tried this, and I'm not a scripter.

For this line:

myExtensions = [".jpg", ".jpeg", ".eps", ".ps", ".pdf", ".tif", ".tiff", ".gif", ".psd", ".ai"]


I would suspect one could do something like this:

myExtensions = ["100*.jpg"]


But only if that variable can accept a wildcard in the prefix of the filename. Hopefully someone will come along that actually knows ID javascript. Else I can try it out after dinner.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jan 29, 2015 Jan 29, 2015

I've moved this discussion to the scripting forum....

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Mentor ,
Jan 29, 2015 Jan 29, 2015

Hi,

I would modify line 52

(so leave extensions untouched and add prefix where the file name is matched):

myFiles = myFolder.getFiles("Prefix*"+ myExtension);


In case of more complex matches (another part of name; more wildcards needed) ==> it could be a function() used as a parameter.


Jarek

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guest
Jan 29, 2015 Jan 29, 2015
LATEST

Hi guys thank you for your help I will try your suggestions and post the results, thank you again I really appreciate it.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines