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

Need ExtendedScript to change paragraph formats

Mentor ,
Feb 07, 2013 Feb 07, 2013

Copy link to clipboard

Copied

Hi

We are migrating our old courses into a new FrameMaker template. As part of this process, we have to change the content with old paragraph formats to new paragraph formats as well. For example, content with paragraph tag "Bullet1" in the old course should be changed to "ListBullet1" paragraph format in the new course.

 

I am aware of two approaches for this task.

1.  Open each FM file and use Global Update feature to update the each format at file level.

2.  Use Paragraph Tools shareware plug-in from Silicon Prairie to update the each format at book level.

We have 70+ paragraph formats to be converted. So, is there a ExtendedScript to do this task?

TOPICS
Scripting

Views

1.0K

Translate

Translate

Report

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 ,
Feb 07, 2013 Feb 07, 2013

Copy link to clipboard

Copied

Hi Sreekanth,

Fun question. This is exactly the type of thing scripting is good for. Here is a script that does the task for a single format change for a single, active document. It could be expanded to work over a book, all active docs, a list of pgf formats,  etc. But, this is as much as I can scratch down at the moment.  To make this useful, you'll probably need to expand it some.

You can change the arguments of the function call to do whichever formats you want.

Russ

ChangePgfFmt("Bullet1", "ListBullet1");

function ChangePgfFmt(oldFmtName, newFmtName)

{

    var newPgfFmt, pgf;

    //get the active document

    var doc = app.ActiveDoc;

    if(!doc.ObjectValid())

    {

        alert("No active document.");

        return;

    }

    //get the new paragraph format

    newPgfFmt = doc.GetNamedObject (Constants.FO_PgfFmt, newFmtName);

    if(!newPgfFmt.ObjectValid())

    {

        alert("The new paragraph format name is bogus.");

        return;

    }

    //get the new paragraph format properties. This will include the name

    props = newPgfFmt.GetProps();

   

    //start iterating through all paragraphs in the doc

    pgf = doc.FirstPgfInDoc;

   

    while(pgf.ObjectValid())

    {

        //if the current paragraph has a format applied

        //with the old pgf format name, apply the new

        //format properties. This will apply the new name.

        if(pgf.Name == oldFmtName)

           pgf.SetProps(props);

       

        pgf = pgf.NextPgfInDoc;

    }

  

}

Votes

Translate

Translate

Report

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 ,
Feb 07, 2013 Feb 07, 2013

Copy link to clipboard

Copied

Thanks Russ for your quick reply.

I am still very new to ExtendedScript. From what I see here, I need to execute this script for every paragraph tag. Is it possible to use some kind of array (or anything else) and use this to change multiple tags in one go?

I am just thinking if I can have a table with old and new tags, which the script can use to find/ replace in the document.

FM_OldTag_NewTag_Sample.jpg

Votes

Translate

Translate

Report

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 ,
Feb 08, 2013 Feb 08, 2013

Copy link to clipboard

Copied

Hi Sreekanth,

I didn't have time yesterday, but I did take a few minutes today to enhance the script to use arrays. It now takes two parallel lists of format names, old and new, which can be as long as you want. You'll have to edit the script manually to put in the formats you want. It would certainly be possible to read from a table, but this would be a bit more involved and is beyond what I can do for free.

In this new script, I removed the warning and abort if an input format name is bogus.

Russ

var oldFmtNames=new Array("OldFmt1","OldFmt2","OldFmt3");

var newFmtNames=new Array("ReplacementFmt1","ReplacementFmt2","ReplacementFmt3");

ChangePgfFmt(oldFmtNames, newFmtNames);

function ChangePgfFmt(oldFmtNames, newFmtNames)

{

    //Make sure our arrays are valid and balanced

    if(oldFmtNames.length == 0 ||

       newFmtNames.length == 0 ||

       oldFmtNames.length != newFmtNames.length)

    {

        alert("Something is wrong with the input " +

                "format arrays. Cannot continue.");

        return;

    }

   

    var newPgfFmt, pgf;

    //get the active document

    var doc = app.ActiveDoc;

    if(!doc.ObjectValid())

    {

        alert("No active document.");

        return;

    }

    for(i = 0; i < oldFmtNames.length; i++)

    {

        //get the new paragraph format

        newPgfFmt = doc.GetNamedObject (Constants.FO_PgfFmt, newFmtNames);

        if(!newPgfFmt.ObjectValid())

        {

            continue;

            //alert("The new paragraph format name is bogus.");

            //return;

        }

        //get the new paragraph format properties. This will include the name

        props = newPgfFmt.GetProps();

       

        //start iterating through all paragraphs in the doc

        pgf = doc.FirstPgfInDoc;

       

        while(pgf.ObjectValid())

        {

            //if the current paragraph has a format applied

            //with the old pgf format name, apply the new

            //format properties. This will apply the new name.

            if(pgf.Name == oldFmtNames)

               pgf.SetProps(props);

           

            pgf = pgf.NextPgfInDoc;

        }

    }

}

Votes

Translate

Translate

Report

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 ,
Feb 08, 2013 Feb 08, 2013

Copy link to clipboard

Copied

Thanks Russ. I will try to take it forward from here.

Votes

Translate

Translate

Report

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 ,
Feb 11, 2013 Feb 11, 2013

Copy link to clipboard

Copied

One suggestion to improve Russ's code: You should do the active document test once before you start processing the paragraph formats. You might lay it out something like this:

if (app.ActiveDoc.ObjectValid() === 1) {

  processFormats (ActiveDoc);

} else {

  alert ("There is no active document.");

}

function processFormats (doc) {

// Set up your arrays in here.

// Or read in the data from a text file.

// Loop through the arrays.

// For each pair formats:

findChangeFormat (old, new, doc);

}

function findChangeFormat (old, new, doc) {

}

Rick

Votes

Translate

Translate

Report

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 ,
Feb 11, 2013 Feb 11, 2013

Copy link to clipboard

Copied

LATEST

Thanks for your inputs Rick.

Since I am new to this, I am getting help from a programmer to learn and get this done. Hopefully, we will be able to get the expected result in a week's time.

Votes

Translate

Translate

Report

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