Copy link to clipboard
Copied
Dear experts,
In continuation of "How to define the offset for a textrange (after a TAB)?" i have implemented the snippet into the existing script-flow (simplefied for the presentation here):
Why does line 29 not get the same paragraph object (paragraph 5) as it was handled correctly in the previous While as last object?
// Have the expanded RTF file (FM-biblio-collected-test.fm) open
#target framemaker
var goRtfDoc = app.ActiveDoc;
var pgf = goRtfDoc.MainFlowInDoc.FirstTextFrameInFlow.FirstPgf; // get first pgf in flow
var TAB = String.fromCharCode(8); // FM has wrong ASCI for TAB
var tabRange
// --- read the temp/formatted citations --- "formatted" consist of the reference number only
while (pgf.ObjectValid()) {
pgfText = GetText (pgf, goRtfDoc);
if (pgfText.substring (0,2) === "[[") { // citation lines start with [[
parts = pgfText.split(TAB); // get the two parts of the line
parts[0] = parts[0].replace("[[", "{"); // replace [[...]] by {...} for find in user doc
parts[0] = parts[0].replace("]]", "}");
if (parts[1].substring (0,1) === "{") { // this placeholder is unresolved, skip it
nUnres += 1;
pgf = pgf.NextPgfInFlow;
continue;
}
// gasFmtCitsRaw.push (parts[0]); // store the placeholder citation
// gasFmtCitsFmt.push (parts[1]); // store the formatted citation (just a number)
pgf = pgf.NextPgfInFlow;
} else { break } // first line of bibliography encountered
}
// --- read the bibliography paragraphs
while (pgf.ObjectValid()) { // until end of doc
tabRange = GetTabRange (pgf, goRtfDoc); // Get the text range starting after the TAB to the end of the paragraph.
// gaoBibliography.push(tabRange); // store the paragraph-part in the array
goRtfDoc.TextSelection = tabRange; // for later use in tests
goRtfDoc.Copy (0); // Check manually what can be copied
alert ("are we OK?");
pgf = pgf.NextPgfInFlow;
}
function GetTabRange (pgf, doc) {
var textLoc, textRange, findParams, tabRange;
textLoc = new TextLoc (pgf, 0); // Make a text location at the beginning of the paragraph.
findParams = GetFindParams ("\x08"); // Get the find parameters for finding a tab.
textRange = doc.Find (textLoc, findParams); // Search for the string.
if (textRange.beg.obj.ObjectValid ()) { // See if the tab was found.
alert (textRange.beg.obj.Unique + " " + pgf.Unique); //?? Is <> if cursor is not at start of pgf.
if (textRange.beg.obj.Unique === pgf.Unique) {// Make sure the tab is in the correct paragraph.
// Select the text from after the tab up to the end of the paragraph.
tabRange = new TextRange (new TextLoc (pgf, textRange.beg.offset+1), new TextLoc (pgf, Constants.FV_OBJ_END_OFFSET - 1));
return tabRange; // Return the text range.
}
}
return 0; // TAB Not found
}
function GetFindParams (string) {
var findParams = AllocatePropVals (1);
findParams[0].propIdent.num = Constants.FS_FindText;
findParams[0].propVal.valType = Constants.FT_String;
findParams[0].propVal.sval = string;
return findParams;
} // --- end of GetFindParams
function GetText (textObj, doc) {
var j, text = "", textItems;
if (textObj.constructor.name !== "TextRange") { // Get a list of the strings in the text object or text range
var textItems = textObj.GetText(Constants.FTI_String);
} else {
textItems = doc.GetTextForRange(textObj, Constants.FTI_String);
}
for (var j = 0; j < textItems.len; j += 1) { // Concatenate the strings
text += (textItems.sdata);
}
return text; // Return the text
} // --- end GetText
Any ideas are welcome
Klaus Daube
Klaus,
I can't explain the behavior you are seeing, as it appears that textLoc is ignored in line 41:
textRange = doc.Find (textLoc, findParams);
I don't know if it is a bug, or what the problem is. However, I did find a potential workaround. I added the following lines just before line 41, in order to force the insertion point to the beginning of the current paragraph:
var searchStart = new TextRange(new TextLoc(pgf,0), new TextLoc (pgf, 0));
doc.TextSelection = searchStart;
...as in:
| function Ge |
Copy link to clipboard
Copied
Further investigation with the test file mentioned in the first post.
To come closer to the problem I insert logging (the Console command does not log into the JavaScript console of ESTK, hence the $.writeln)
after line 41: $.writeln ("3: "+ textRange.beg.obj.Unique + " " + pgf.Unique);
Line 43 removed.
after line 27: $.writeln ("2: " + pgf.Unique);
after line 12: $.writeln ("1: " + pgf.Unique);
Then I put the cursor at the beginning of the the test file and run the script.
The console shows this (<- ... is comment)
1: 999540 <- first para in first part
1: 999551 <- second para in first part
1: 999562 <- third para in first part
1: 999571 <- fourth para in first part
1: 999582 <- fifth para = first of second part
2: 999582
3: 999540 999582
3: 999551 999593
3: 999562 999606
Result: [object Pgf]
Hence GetTabRange searches in the first three pgfs of the document, although the While loop runs through the 3 pgf of the second part.
Why this?
Copy link to clipboard
Copied
I'm still stuck in this problem:
In fucntion GetTabRange (pgf, doc) the line
textRange = doc.Find (textLoc, findParams);
finds the TAB in the first paragraph of the test document (red rectangle), not in the current paragraph (blue rectangle). The read lines to the right indicate the Para-IDs

I have placed a breakpoint in function GetTabRange and tiptoed until after the Find:

At this point the databrowser confirms with the values for the begin- and end-offsets that I'm in the first paragraph, not the fifth.

Why does doc.find search not search in the current paragraph (ID = 999582)?
Copy link to clipboard
Copied
Klaus,
I can't explain the behavior you are seeing, as it appears that textLoc is ignored in line 41:
textRange = doc.Find (textLoc, findParams);
I don't know if it is a bug, or what the problem is. However, I did find a potential workaround. I added the following lines just before line 41, in order to force the insertion point to the beginning of the current paragraph:
var searchStart = new TextRange(new TextLoc(pgf,0), new TextLoc (pgf, 0));
doc.TextSelection = searchStart;
...as in:
| function GetTabRange (pgf, doc) { |
| var textLoc, textRange, findParams, tabRange; | ||
| textLoc = new TextLoc (pgf, 0); | // Make a text location at the beginning of the paragraph. | |
| findParams = GetFindParams ("\x08"); | // Get the find parameters for finding a tab. | |
| var searchStart = new TextRange (new TextLoc (pgf,0), new TextLoc (pgf, 0)); | ||
| doc.TextSelection = searchStart; | ||
| textRange = doc.Find (textLoc, findParams); | // Search for the string. | |
| if (textRange.beg.obj.ObjectValid ()) { | // See if the tab was found. | |
| alert (textRange.beg.obj.Unique + " | " + pgf.Unique); //?? Is <> if cursor is not at start of pgf. | |
| if (textRange.beg.obj.Unique === pgf.Unique) {// Make sure the tab is in the correct paragraph. | ||
| // Select the text from after the tab up to the end of the paragraph. | ||
| tabRange = new TextRange (new TextLoc (pgf, textRange.beg.offset+1), new TextLoc (pgf, Constants.FV_OBJ_END_OFFSET - 1)); | ||
| return tabRange; | // Return the text range. | |
| } | ||
| } | ||
| return 0; | // TAB Not found | |
| } |
After this, the behavior of the script seems to match what you want. I hope this helps some. By the way, the code sample looks all crazy in my browser editor, not sure how it will appear when I click Add Reply.
Russ
Copy link to clipboard
Copied
OK, it added lots of empty lines, but I think all the content is still there.
Copy link to clipboard
Copied
Thank You very much, Russ, this is really the solution to my problem.
And it's a relief that also the experts have no idee whythe waters are so murky.
Klaus
The correctly working function is this:
function GetTabRange (pgf, doc) {
var textLoc, textRange, findParams, tabRange;
textLoc = new TextLoc (pgf, 0); // Make a text location at the beginning of the paragraph.
findParams = GetFindParams ("\x08"); // Get the find parameters for finding a tab.
// --- the following two lines by Russ Ward saved my project
var searchStart = new TextRange(new TextLoc(pgf,0), new TextLoc (pgf, 0));
doc.TextSelection = searchStart;
// --- because otherwise the following statement starts at the beginning of the file, not the current pgf
textRange = doc.Find (textLoc, findParams); // Search for the string.
if (textRange.beg.obj.ObjectValid ()) { // See if the tab was found.
if (textRange.beg.obj.Unique === pgf.Unique) {// Make sure the tab is in the correct paragraph.
// Select the text from after the tab up to the end of the paragraph.
tabRange = new TextRange (new TextLoc (pgf, textRange.beg.offset+1), new TextLoc (pgf, Constants.FV_OBJ_END_OFFSET - 1));
return tabRange; // Return the text range.
}
}
return 0; // TAB Not found
}
Copy link to clipboard
Copied
Also, I apologize that my response was so delayed. I took a week off for the US Thanksgiving holiday and hardly touched the computer during that time. I'm thankful for that.
Get ready! An upgraded Adobe Community experience is coming in January.
Learn more