Highlighted

Need help with regex

Community Beginner ,
Feb 18, 2019

Copy link to clipboard

Copied

I am working on a script to apply a hypertext marker to text with a specific character tag (Framemaker 19). The script will find the text with the  tag, read the text, and apply the marker. The problem is that it applies the marker to any text with this character tag and I need it to only apply to certain text (F1, T2, etc.). This is why I'm trying to use regex, but it's not working. My script and notes are below. I'm been staring at this way too long. Can anyone see what I'm doing wrong?

//This first part finds text that has the character tag "Link." (I know it needs to be a function, but I'm having trouble with that, too, so I'll deal with it later.)

var doc = app.ActiveDoc;

var charFmt = doc.GetNamedCharFmt("Link");

var findParams = AllocatePropVals(2);

var fmtName = "Link";

var pgf = doc.FirstPgfInDoc;

   

        findParams[0].propIdent.num = Constants.FS_FindCharTag;   

        findParams[0].propVal.valType = Constants.FT_String;   

        findParams[0].propVal.sval = fmtName; 

     

        findParams[1].propIdent.num = Constants.FS_FindWrap;   

        findParams[1].propVal.valType = Constants.FT_Integer;   

        findParams[1].propVal.ival = false; 

 

var textRange = new TextRange();

      textRange.beg.obj = textRange.end.obj = doc.MainFlowInDoc.FirstTextFrameInFlow.FirstPgf; 

      textRange.beg.offset = textRange.end.offset = 0; 

      doc.TextSelection = textRange;

      textRange = doc.Find(textRange.beg, findParams);

  

// This calls a function to read the text

var num = getText(pgf, doc);

     alert (num); // This works. It is getting and reading the text

// This is where I'm trying to use regex -- to match the variable "num"

var regex = /(?:Figure|Table) ((AF|AT|[FT])(\d+))/g;  // Match figure or table number in text. Would there be a way to add this to the findParams section instead?

if (regex.test (num) === true) { //This is what doesn't work for me

    createMarker (num);

    }

// If I just call the function "createMarker (num)" without using the regex, it will apply the correct marker, but to whatever text is tagged "Link." So if the word "few" is tagged "Link", it will have the marker "gotolink few," which is not what we need.

function getText (pgf, doc) {    //This works, reads the text

    var text = "", textItems, i; 

    if (textRange.constructor.name !== "TextRange") {  // Get a list of the strings in the text object or text range. 

        textItems = textRange.GetText(Constants.FTI_String); 

    } else { 

         textItems = doc.GetTextForRange(textRange, Constants.FTI_String); 

    } 

    // Concatenate the strings. 

    for (i = 0; i < textItems.len; i += 1) { 

        text += (textItems.sdata); 

    } 

return text;

}

function createMarker (text) { // This works, creates the marker

    var marker = doc.NewAnchoredObject(Constants.FO_Marker, (textRange.beg, textRange.end)); 

    var markerType = doc.GetNamedObject(Constants.FO_MarkerType, "Hypertext"); 

    marker.MarkerTypeId = markerType; 

    marker.MarkerText = "gotolink " + text.toLowerCase (); 

    return 1;

}

//Once I can get the regex working, the next step will be to make it search for the next instance of "Link," and then work its way through the document.

Thank you.

I have only used regex in the match method for a string. I am not aware of the test method for a regex and not sure if that is supported in ExtendScript. Also, the regex support in ESTK is not extensive (pun intended) so you should not use the lookahead or the \d - I tested and they do not give me any matches.

Try this instead:

if ( mystring.match( '(Figure|Table) (AF|AT|FT)[0-9]+' ) != null ) createMarker( num );

Good luck

4everJang

TOPICS
Scripting

Views

716

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

Need help with regex

Community Beginner ,
Feb 18, 2019

Copy link to clipboard

Copied

I am working on a script to apply a hypertext marker to text with a specific character tag (Framemaker 19). The script will find the text with the  tag, read the text, and apply the marker. The problem is that it applies the marker to any text with this character tag and I need it to only apply to certain text (F1, T2, etc.). This is why I'm trying to use regex, but it's not working. My script and notes are below. I'm been staring at this way too long. Can anyone see what I'm doing wrong?

//This first part finds text that has the character tag "Link." (I know it needs to be a function, but I'm having trouble with that, too, so I'll deal with it later.)

var doc = app.ActiveDoc;

var charFmt = doc.GetNamedCharFmt("Link");

var findParams = AllocatePropVals(2);

var fmtName = "Link";

var pgf = doc.FirstPgfInDoc;

   

        findParams[0].propIdent.num = Constants.FS_FindCharTag;   

        findParams[0].propVal.valType = Constants.FT_String;   

        findParams[0].propVal.sval = fmtName; 

     

        findParams[1].propIdent.num = Constants.FS_FindWrap;   

        findParams[1].propVal.valType = Constants.FT_Integer;   

        findParams[1].propVal.ival = false; 

 

var textRange = new TextRange();

      textRange.beg.obj = textRange.end.obj = doc.MainFlowInDoc.FirstTextFrameInFlow.FirstPgf; 

      textRange.beg.offset = textRange.end.offset = 0; 

      doc.TextSelection = textRange;

      textRange = doc.Find(textRange.beg, findParams);

  

// This calls a function to read the text

var num = getText(pgf, doc);

     alert (num); // This works. It is getting and reading the text

// This is where I'm trying to use regex -- to match the variable "num"

var regex = /(?:Figure|Table) ((AF|AT|[FT])(\d+))/g;  // Match figure or table number in text. Would there be a way to add this to the findParams section instead?

if (regex.test (num) === true) { //This is what doesn't work for me

    createMarker (num);

    }

// If I just call the function "createMarker (num)" without using the regex, it will apply the correct marker, but to whatever text is tagged "Link." So if the word "few" is tagged "Link", it will have the marker "gotolink few," which is not what we need.

function getText (pgf, doc) {    //This works, reads the text

    var text = "", textItems, i; 

    if (textRange.constructor.name !== "TextRange") {  // Get a list of the strings in the text object or text range. 

        textItems = textRange.GetText(Constants.FTI_String); 

    } else { 

         textItems = doc.GetTextForRange(textRange, Constants.FTI_String); 

    } 

    // Concatenate the strings. 

    for (i = 0; i < textItems.len; i += 1) { 

        text += (textItems.sdata); 

    } 

return text;

}

function createMarker (text) { // This works, creates the marker

    var marker = doc.NewAnchoredObject(Constants.FO_Marker, (textRange.beg, textRange.end)); 

    var markerType = doc.GetNamedObject(Constants.FO_MarkerType, "Hypertext"); 

    marker.MarkerTypeId = markerType; 

    marker.MarkerText = "gotolink " + text.toLowerCase (); 

    return 1;

}

//Once I can get the regex working, the next step will be to make it search for the next instance of "Link," and then work its way through the document.

Thank you.

I have only used regex in the match method for a string. I am not aware of the test method for a regex and not sure if that is supported in ExtendScript. Also, the regex support in ESTK is not extensive (pun intended) so you should not use the lookahead or the \d - I tested and they do not give me any matches.

Try this instead:

if ( mystring.match( '(Figure|Table) (AF|AT|FT)[0-9]+' ) != null ) createMarker( num );

Good luck

4everJang

TOPICS
Scripting

Views

717

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
Feb 18, 2019 0
Advocate ,
Feb 18, 2019

Copy link to clipboard

Copied

I have only used regex in the match method for a string. I am not aware of the test method for a regex and not sure if that is supported in ExtendScript. Also, the regex support in ESTK is not extensive (pun intended) so you should not use the lookahead or the \d - I tested and they do not give me any matches.

Try this instead:

if ( mystring.match( '(Figure|Table) (AF|AT|FT)[0-9]+' ) != null ) createMarker( num );

Good luck

4everJang

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...
Feb 18, 2019 0
Community Beginner ,
Feb 19, 2019

Copy link to clipboard

Copied

That did it! Thank you!

if (num.match('(AF|AT|[FT])([0-9]+)') != null ) {

    createMarker (num);

    }

(Realized I didn't need the words Figure or Table)

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...
Feb 19, 2019 0
Adobe Community Professional ,
Feb 19, 2019

Copy link to clipboard

Copied

I don't have a lot of time to help this morning, but I question the approach you are taking. I would try to find the strings first, and not the Link character tag. Can we assume that any text that matches the regular expression should become a link? Typically, I would do something like this:

1) Find the strings that need to be links. Each string will be a TextRange object somewhere in your code.

2) For each string, add the correct marker to the TextRange.

3) Extend the TextRange so that the new marker is included.

4) Apply the Link character format to the TextRange.

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...
Feb 19, 2019 0
Advocate ,
Feb 19, 2019

Copy link to clipboard

Copied

It depends on the current state of the content. If there are Link character tags already, the approach works fine.

If there are no such tags or they might not be complete or consistent, Rick's approach would work.

But in such cases you should be really careful about your regex, as it might catch unwanted pieces of text and apply Link tags on them. I would then use the Figure or Table and whitespace in the regex to make it as specific as possible. And as I mentioned in another thread today (about replacing the ".gif" of images with ".png", there is no support for lookahead or lookbehind in the regex for ESTK.

Make sure to do thorough testing before you run an automated script. In my 15 years of scripting I found that about 75-80% of my time is spent on catching all possible errors.

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...
Feb 19, 2019 0
Community Beginner ,
Feb 19, 2019

Copy link to clipboard

Copied

The character tag Link is already there; I'm just adding the hypertext markers to them. However, the word Figure or Table isn't always included, so I can only search for F1 or T2, etc. This approach works great, at least for finding the first one.

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...
Feb 19, 2019 0