Создать пустой объект Text, задать ему свойства, и добавить его в конец выбранного фрейма?

  • Автор темы Автор темы Vadim_PDF
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Vadim_PDF

Топикстартер
15 лет на форуме
Сообщения
1 648
Реакции
237
Можно ли создать пустой (дефолтный) объект Text, задать ему свойства (форматирование), и добавить его в конец выбранного фрейма?

Для чего это надо:
условно есть массив объектов -
Код:
{ name: "Вася",
link:"google.com",
color:"синий",
status:"Бомж",
vid:"HomoSapiens"
age:29
}
и т.д.
это надо преобразовать в текст (многострочный с разным форматированием).

Проблема в том, что создать фрейм, преобразовать все в строку и засунуть через text.content - не вариант.. так как форматирование теряется, и (так как некоторые свойства Васи могут повторятся или отсутствовать) - потом найти их regex-ом затруднительно.

Идеальный вариант типа:
Код:
var x = new Text;
x.fillcolor = swatch5
x.content  = "google.com"
...
myText.append(x); //myText- общий текст, уже во фрейме
но проблема в том, что при создании x - хоть и создается object Text, какой-то он не правильный (свойств нет и т.д.) - и в TextFrame потом не вставляется.
Кроме того - нет метода append.. :(

Единственное что вижу, создавать ненужный TextFrame, наполнять его content, добавлять форматирование после чего через app.copy(); app.paste(); вставлять в нужный фрейм через
insertionPoints[story.insertionPoints.length - 1] и убивать исходный TextFrame (ну или использовать для дальнейшей работы).
По сути вариант... но какой-то костыльный до жути...
 
Костыльный метод работает, но!
1. при большом количестве вставок и быстрой обработке - вылетает Индизайн
2. при добавлении $.sleep(200); перед Copy, paste, remove() - перестает вылетать.. но скорость - можно уснуть.

Все ещё ищется адекватный способ создание и слияния объектов text.
P.S. Кроме того, как только начинается переполнение фрейма - текст вставляется не в конец текста ... а в точку после которой идет переполнение.. что само по себе - логично.. но не нужно.
 
Последнее редактирование:
я подобное делаю через XML (который внутри InDesign - View->Structure). создаю в структуре элементы, причем там им сразу и стили можно присвоить, а потом уже в макет ставить/убирать.
 
Ок, буду изучать..
Нарыл тут методом ковыряния.

Код:
// Создаем пустой текстовый бокс. Ставим курсор внутрь.
myDoc = app.activeDocument;
myText=app.selection[0]; // На самом деле это не объект Text,  а объект insertionPoints. в чем отличие разбираюсь, свойства такие же как у текста (полностью не сличал)
myTextFrame = app.selection[0].parentTextFrames[0];
myCopy =myText.duplicate(LocationOptions.AFTER,myTextFrame.insertionPoints[0]) ;
for (var i =10000; i > 0 ; i-- ){
    myCopy =myText.duplicate(LocationOptions.AFTER,myTextFrame.insertionPoints[0]) ;
    myCopy.contents = i + "aaaaaaabbbbbvvvvvuuuuu\r"; //Тут с текстом можно делать все что угодно
    
    }
Скорость приятная, вылетов нет (так как видно нет рассинхрона между командами системы copy() paste() и js)

ss.png

интересно посимвольное соблюдение стиля копируемого текста если изначально была выбрана строка а не просто поставлен курсор. Логично..

P.S. из неприятного - вставлять лучше задом наперед, что бы текст не всавлялся куда не надо при переполнеии фрейма
 
Если фрейм в который перемещаете текст последний в цепочке,
можно новый фрейм просто привязать к нему и текст переползет.
Код:
myTextFrame.nextTextFrame =  myNewFrame;
А потом убить ненужный фрейм.

Если хочется текст перенести, то его надо перенести методом move.
Если myText -- то что надо перенести, а курсор стоит там куда надо перенести
Код:
myText.move(LocationOptions.AFTER, app.activeDocument.selection[0]);
 
Статус
Закрыто для дальнейших ответов.