Странности циклов JS в InDesign

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

SergGR

Участник
Топикстартер
Сообщения
24
Реакции
11
Имеется скрипт на VB по обновлению линков в ТВ-программе
Код:
Set myInd = CreateObject("InDesign.Application.CS3")
myInd.ScriptPreferences.Version = 5.0
If myInd.ScriptPreferences.EnableRedraw Then
	myInd.ScriptPreferences.EnableRedraw = False
End If
myInd.ScriptPreferences.Version = 4.0
If myInd.Documents.Count > 0 Then
	Set myDoc = myInd.ActiveDocument
	For Each myLink In myDoc.Links
		If myLink.Edited Then
			If (myLink.Status <> idLinkStatus.idLinkMissing And myLink.Status <> idLinkStatus.idNormal) Or myLink.Status = idLinkStatus.idLinkOutOfDate Then
				Set myFrame = myLink.Parent.TextFrames(1)
				Select Case myFrame.Label
					Case "MV"
						myFrame.Label = "MV_New"
					Case "DMV"
						myFrame.Label = "DMV_New"
					Case "21C"
						myFrame.Label = "21C_New"
					Case "Film"
						myFrame.Label = "Film_New"
					Case "TVM"
						myFrame.Label = "TVM_New"
					Case "STVM"
						myFrame.Label = "STVM_New"
					Case "CTV"
						myFrame.Label = "CTV_New"
				End Select
				If Left(myFrame.Label, 3) = "TV-" Then
					myFrame.Label = myFrame.Label & "_New"
				End If
				myLink.Update
			End If
		End If
	Next
MsgBox "ГОТОВО!", ,"УРА!!!!"
End If
Решил перевести его на JS, чтобы был универсальным
Код:
main()
function main()
{
	if (app.documents.length == 0) exit();
	for(i = 0; i < app.documents[0].links.length; i++)
	{
		var currentLink = app.documents[0].links[i];
		if(!(currentLink.edited && ((currentLink.status != LinkStatus.linkMissing && currentLink.status != LinkStatus.normal) || currentLink.status == LinkStatus.linkOutOfDate)))
			continue;
		currentLink.parent.contents = "update\r";
		var tempPara = currentLink.parent.paragraphs[0];
		tempPara.select(SelectionOptions.replaceWith);
		var textFrame = app.selection[0].parentTextFrames[0];
		if(textFrame.label.length < 2) continue;
		var label = textFrame.label.substr(0,2);
		if(label == "MV" || label == "DM" || label == "21" || label == "Fi" || label == "TV" || label == "ST" || label == "CT")
		{
			textFrame.label += "_New";
			currentLink.update();
		}
	}
	alert("ГОТОВО!", "УРА!!!!");
и сталкнулся с двумя проблеммами:
1. конструкция типа currentLink.parent.textFrames[0] возвращает ошибку а не фрейм содержащий линк, но эта проблема в представленном коде обойдена.
2. Почему-то в цикле обрабатываются не все линки и скрипт приходится перезапускать НЕСКОЛЬКО РАЗ!!!
В чем может быть проблема?
Скрипт проверялся в InDesign CS3
 
Ответ: Странности циклов JS в InDesign

Сейчас проверять некогда, но есть подозрение, что после операции currentLink.update() линки в массиве переупорядочиваются.
 
Ответ: Странности циклов JS в InDesign

Спасибо за идею!
Добавил после строки обновления линка сброс счетчика в 0 и все прекрасно заработало!
 
Ответ: Странности циклов JS в InDesign

Еще одна идея - для ускорения сдублировать массив documents[0].links и запускать цикл уже по нему.
 
Ответ: Странности циклов JS в InDesign

Можно и по другому, сначала запушить линки соответствующие условию в новый массив а затем его уже обработать!
 
Ответ: Странности циклов JS в InDesign

Да, так оптимальнее будет.
 
Статус
Закрыто для дальнейших ответов.