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

Set text using a TextItems structure

Explorer ,
Jun 04, 2019 Jun 04, 2019

Hi,

I am getting TextItems out of an element using:

     currentElem.GetText(Constants.FTF_ALL);

I am then modifying the sdata for some of the items, and want to write this structure back into the element I got it from.

If I just use doc.Clear then doc.AddText, I have to pass in a string, and thus lose all the markers, anchors etc in the TextItems.

I can't find a documented way to pass in TextItems to a function, anyone got ideas/workarounds to preserve the non-string text items?

Or a way to modify the TextItems on an object directly?

Thanks in advance,

Dan

TOPICS
Scripting
1.8K
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

correct answers 1 Correct answer

Advocate , Jun 04, 2019 Jun 04, 2019

No, that is not how it works.

If you want to replace text in some of the text items, you need to make changes to the individual text strings, not to the entire contents of the element. Something like this:

1. Get all text items in the element

2. Loop through all text items

3. For each text item of type string that requires replacing:

     Set TextLoc 1 to point to the start of that string ( offset property of your text item )

     Set TextLoc 2 to point to the end of the string ( offset property plus

...
Translate
Advocate ,
Jun 04, 2019 Jun 04, 2019

No, that is not how it works.

If you want to replace text in some of the text items, you need to make changes to the individual text strings, not to the entire contents of the element. Something like this:

1. Get all text items in the element

2. Loop through all text items

3. For each text item of type string that requires replacing:

     Set TextLoc 1 to point to the start of that string ( offset property of your text item )

     Set TextLoc 2 to point to the end of the string ( offset property plus length of text string )

     Create a text range from these two TextLoc objects

     Set the TextSelection property of your Doc object to this text range

     Use the Doc.Clear method

     Add new text to the document, using TextLoc 1.

Note that after doing this you should get the text items again, as the offsets might have changed by replacing text. The way to get around this hassle is to work through the list of text items from the back to the front.

Good luck

4everJang

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
Explorer ,
Jun 04, 2019 Jun 04, 2019

Perfect!

This makes so much sense now, I was already looping through the text items to modify them, so I feel silly for not putting 2 and 2 together.

Thanks for your help!

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
Advocate ,
Jun 04, 2019 Jun 04, 2019
LATEST

Just make sure to work from back to front - as shown in Rick's example - as the changes in the offsets will not affect the offsets of text items before 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
Community Expert ,
Jun 04, 2019 Jun 04, 2019

Hi,

I have a function that just deletes the strings from a text range. I am not sure if this will help you, but it may get you started.

Rick

function deleteStrings (textRange, doc) {   

   

    var textItems, i, tRange;

   

    // Get a list of strings in the text range.

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

    for (i = textItems.len - 1; i >= 0; i -= 1) {

        // Make a text range from the string and delete it.

        tRange = new TextRange (

            new TextLoc (textRange.beg.obj, textItems.offset),

            new TextLoc (textRange.beg.obj, textItems.offset + textItems.sdata.length));

        doc.DeleteText (tRange);

    }

}

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