Highlighted

Script no longer working

Explorer ,
Apr 22, 2020

Copy link to clipboard

Copied

I have a script that was working perfectly, but no longer does. I'm wondering if a recent update from FrameMaker might have changed/broken something. Did any property names change? I have 2019, version 15.0.4.751.

 

The full script is below. Basically what it does is read through the body pages looking for paragraphs with a specific paragraph tag. The paragraphs may or may not be part of the main flow. If found, it adds a newlink hypertext marker. However, now it doesn't only look at the body page; it picks up items from the reference page, too. Also, it's missing some of the paragraphs it's supposed to work on. 

 

Has anyone else experienced this? The script is a huge timesaver for us, but the last two documents I've run it on, it's skipped all but one paragraph that it should have added the newlink marker to.

--------

#target framemaker
main ();

// Check for an open document
function main () {

var doc;
doc = app.ActiveDoc;
if (doc.ObjectValid () === 1) {
processDoc (doc);
}
else {
alert ("There is no active document.");
}
}

function processDoc (doc) {
var pgfRegex, page, frame, textFrame, pgf;
page = doc.FirstBodyPageInDoc;
frame = page.PageFrame;
textFrame = frame.FirstGraphicInFrame
pgf = textFrame.FirstPgf;

// Turn off the displaying property to speed the script and prevent flicker.
if (app.Displaying === 1) {
app.Displaying = 0;
}

// Match CaptionFigure and CaptionTable paragraph formats.
pgfRegex = /^(CaptionFigure|CaptionTable)$/;

while (pgf.ObjectValid () === 1) {
if (pgfRegex.test (pgf.Name) === true) {
processNewlinkPgf (pgf, doc);
}
pgf = pgf.NextPgfInDoc;
}

// Restore the document's display and refresh the screen.
if (app.Displaying === 0) {
app.Displaying = 1;
doc.Redisplay ();
alert("Markers are added");
}
}

// FUNCTION FOR REGULAR CAPTIONS

function processNewlinkPgf (pgf, doc) {
var num, marker;
num = getFigOrTableNum (pgf);
if (num) {
// See if a newlink marker already exists in the paragraph.
marker = getMarker (pgf, "Hypertext", "newlink");
if (marker) {
// Update the existing marker's text.
marker.MarkerText = "newlink " + num;
}
else { // No existing marker; create a new one.
createMarker (doc, pgf, 0, "Hypertext", "newlink " + num);
}
}
else {
Console ("Couldn't find number: " + pgf.Name);
}
}

// END FUNCTION


//See if a marker exists in a paragraph
function getMarker (pgf, markerType, text) {

var markers = [], marker, textList, i;

textList = pgf.GetText (Constants.FTI_MarkerAnchor);
for (i = 0; i < textList.len; i += 1) {
marker = textList[i].obj;
if (marker.MarkerTypeId.Name === markerType) {
if (marker.MarkerText.indexOf (text) > -1) {
return marker;
}
}
}
}

// Create a new marker
function createMarker(doc, pgf, offset, type, text) {
var tLoc = new TextLoc(pgf, offset);
var marker = doc.NewAnchoredObject(Constants.FO_Marker, tLoc);
var markerType = doc.GetNamedObject(Constants.FO_MarkerType, type);
marker.MarkerTypeId = markerType;
marker.MarkerText = text;
return 1;
}

// FUNCTION FOR REGULAR CAPTIONS

function getFigOrTableNum (pgf) {
var doc;
doc = app.ActiveDoc;
var regex, pgfText, match;

regex = /(?:Figure|Table) ((AF|AT|[FT])(\d+))/; // Match figure or table and number in text

pgfText = getText (pgf, doc);
if (regex.test (pgfText) === true) {
match = pgfText.match (regex);
return (match[1].toLowerCase ());
}
}

//END FUNCTION


function getText (textObj, doc) {
// Gets the text from the text object.
var text = "", textItems, i;
// Get a list of the strings in the text object or text range.
if (textObj.constructor.name !== "TextRange") {
textItems = textObj.GetText(Constants.FTI_String);
} else {
textItems = doc.GetTextForRange(textObj, Constants.FTI_String);
}
// Concatenate the strings.
for (i = 0; i < textItems.len; i += 1) {
text += (textItems[i].sdata);
}
return text; // Return the text
}

 

(@frameexpert is the one who helped me with this script originally.)

Here's an improved version:

 

Replace

while (pgf.ObjectValid () === 1) {
     if (pgf.InTextFrame.FrameParent.PageFramePage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }

 

with:

  
  var oPage;  
    
while (pgf.ObjectValid () === 1) {
    
     var oUAFramePage = pgf.InTextFrame.FrameParent.FrameParent.PageFramePage;
        
    oPage = pgf.InTextFrame.FrameParent.PageFramePage;
    
    if (!oPage.ObjectValid())
        {
        oPage = oUAFramePage;
        }
   
    if (oPage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }

 

TOPICS
Scripting

Views

2.0K

Likes

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

Script no longer working

Explorer ,
Apr 22, 2020

Copy link to clipboard

Copied

I have a script that was working perfectly, but no longer does. I'm wondering if a recent update from FrameMaker might have changed/broken something. Did any property names change? I have 2019, version 15.0.4.751.

 

The full script is below. Basically what it does is read through the body pages looking for paragraphs with a specific paragraph tag. The paragraphs may or may not be part of the main flow. If found, it adds a newlink hypertext marker. However, now it doesn't only look at the body page; it picks up items from the reference page, too. Also, it's missing some of the paragraphs it's supposed to work on. 

 

Has anyone else experienced this? The script is a huge timesaver for us, but the last two documents I've run it on, it's skipped all but one paragraph that it should have added the newlink marker to.

--------

#target framemaker
main ();

// Check for an open document
function main () {

var doc;
doc = app.ActiveDoc;
if (doc.ObjectValid () === 1) {
processDoc (doc);
}
else {
alert ("There is no active document.");
}
}

function processDoc (doc) {
var pgfRegex, page, frame, textFrame, pgf;
page = doc.FirstBodyPageInDoc;
frame = page.PageFrame;
textFrame = frame.FirstGraphicInFrame
pgf = textFrame.FirstPgf;

// Turn off the displaying property to speed the script and prevent flicker.
if (app.Displaying === 1) {
app.Displaying = 0;
}

// Match CaptionFigure and CaptionTable paragraph formats.
pgfRegex = /^(CaptionFigure|CaptionTable)$/;

while (pgf.ObjectValid () === 1) {
if (pgfRegex.test (pgf.Name) === true) {
processNewlinkPgf (pgf, doc);
}
pgf = pgf.NextPgfInDoc;
}

// Restore the document's display and refresh the screen.
if (app.Displaying === 0) {
app.Displaying = 1;
doc.Redisplay ();
alert("Markers are added");
}
}

// FUNCTION FOR REGULAR CAPTIONS

function processNewlinkPgf (pgf, doc) {
var num, marker;
num = getFigOrTableNum (pgf);
if (num) {
// See if a newlink marker already exists in the paragraph.
marker = getMarker (pgf, "Hypertext", "newlink");
if (marker) {
// Update the existing marker's text.
marker.MarkerText = "newlink " + num;
}
else { // No existing marker; create a new one.
createMarker (doc, pgf, 0, "Hypertext", "newlink " + num);
}
}
else {
Console ("Couldn't find number: " + pgf.Name);
}
}

// END FUNCTION


//See if a marker exists in a paragraph
function getMarker (pgf, markerType, text) {

var markers = [], marker, textList, i;

textList = pgf.GetText (Constants.FTI_MarkerAnchor);
for (i = 0; i < textList.len; i += 1) {
marker = textList[i].obj;
if (marker.MarkerTypeId.Name === markerType) {
if (marker.MarkerText.indexOf (text) > -1) {
return marker;
}
}
}
}

// Create a new marker
function createMarker(doc, pgf, offset, type, text) {
var tLoc = new TextLoc(pgf, offset);
var marker = doc.NewAnchoredObject(Constants.FO_Marker, tLoc);
var markerType = doc.GetNamedObject(Constants.FO_MarkerType, type);
marker.MarkerTypeId = markerType;
marker.MarkerText = text;
return 1;
}

// FUNCTION FOR REGULAR CAPTIONS

function getFigOrTableNum (pgf) {
var doc;
doc = app.ActiveDoc;
var regex, pgfText, match;

regex = /(?:Figure|Table) ((AF|AT|[FT])(\d+))/; // Match figure or table and number in text

pgfText = getText (pgf, doc);
if (regex.test (pgfText) === true) {
match = pgfText.match (regex);
return (match[1].toLowerCase ());
}
}

//END FUNCTION


function getText (textObj, doc) {
// Gets the text from the text object.
var text = "", textItems, i;
// Get a list of the strings in the text object or text range.
if (textObj.constructor.name !== "TextRange") {
textItems = textObj.GetText(Constants.FTI_String);
} else {
textItems = doc.GetTextForRange(textObj, Constants.FTI_String);
}
// Concatenate the strings.
for (i = 0; i < textItems.len; i += 1) {
text += (textItems[i].sdata);
}
return text; // Return the text
}

 

(@frameexpert is the one who helped me with this script originally.)

Here's an improved version:

 

Replace

while (pgf.ObjectValid () === 1) {
     if (pgf.InTextFrame.FrameParent.PageFramePage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }

 

with:

  
  var oPage;  
    
while (pgf.ObjectValid () === 1) {
    
     var oUAFramePage = pgf.InTextFrame.FrameParent.FrameParent.PageFramePage;
        
    oPage = pgf.InTextFrame.FrameParent.PageFramePage;
    
    if (!oPage.ObjectValid())
        {
        oPage = oUAFramePage;
        }
   
    if (oPage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }

 

TOPICS
Scripting

Views

2.0K

Likes

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
Apr 22, 2020 0
Enthusiast ,
May 01, 2020

Copy link to clipboard

Copied

Hi jmyers2

If you work with "FirstBodyPageInDoc" and "NextPgfInDoc", the next paragraph is not necessarily on the current body page.It can be anywhere in the document (RefPage - masterpage or another bodypage. Also you don't have "PageNext" anywhere and you don't check if the paragraph is still on the corresponding "BodyPage" or "TextFrame". So you would also have to start with "NextGraphicInFrame" work.
I suggest you work with a different approach that makes things easier and clearer:

 

 

function processDoc (doc) {
var pgfRegex, page, frame, textFrame, pgf;
pgf = doc.FirstPgfInDoc;

// Turn off the displaying property to speed the script and prevent flicker.
if (app.Displaying === 1) {
app.Displaying = 0;
}

// Match CaptionFigure and CaptionTable paragraph formats.
pgfRegex = /^(CaptionFigure|CaptionTable)$/;

while (pgf.ObjectValid () === 1) {
     if (pgf.InTextFrame.FrameParent.PageFramePage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }
}

 

Likes

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
Reply
Loading...
May 01, 2020 0
Explorer ,
May 06, 2020

Copy link to clipboard

Copied

Thank you, I'll give that a try. 

Likes

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
Reply
Loading...
May 06, 2020 0
Enthusiast ,
May 07, 2020

Copy link to clipboard

Copied

Here's an improved version:

 

Replace

while (pgf.ObjectValid () === 1) {
     if (pgf.InTextFrame.FrameParent.PageFramePage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }

 

with:

  
  var oPage;  
    
while (pgf.ObjectValid () === 1) {
    
     var oUAFramePage = pgf.InTextFrame.FrameParent.FrameParent.PageFramePage;
        
    oPage = pgf.InTextFrame.FrameParent.PageFramePage;
    
    if (!oPage.ObjectValid())
        {
        oPage = oUAFramePage;
        }
   
    if (oPage.constructor.name == "BodyPage")
            {
            if (pgfRegex.test (pgf.Name) === true) {
            processNewlinkPgf (pgf, doc);
            }
        }
    pgf = pgf.NextPgfInDoc;
    }

 

Likes

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
Reply
Loading...
May 07, 2020 0
jmyers2 LATEST
Explorer ,
May 14, 2020

Copy link to clipboard

Copied

That did it. Thanks!

Likes

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
Reply
Loading...
May 14, 2020 0