Новый скрипт: Footnoter

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

GoldyZ

Участник
Топикстартер
Сообщения
160
Реакции
0
Заканчивается доводка скрипта Footnoter. Название само за себя. Скрипт занимается расстановкой сносок в публикации и их последующей обработкой. Но вопросы.

Какие функции ждут уважаемые от скрипта с подобным названием?
 
Ответ: Новый скрипт: Footnoter

Приятно было бы, если бы он работал аналогично такой же функции в Вентуре: прочитывал разметку из Ворда, автоматически обновлялся, позволял сделать линеечку над текстом и т.д. А когда ожидается продукт? Потребность давно назрела.
С.Хос
 
из

Разметку из Ворда не читает, частично автоматически обновляется, линеечки ставит (через свойства стиля).

Footnoter 0.9

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


Верстальщик
при оформлении сносок в среде InDesign, Quark, PageMaker:
1. копирует текст сноски из внешнего источника или вырезает из уже заверстанного в публикацию материала;
2. создает новый фрейм и вставляет туда содержимое буфера обмена;
3. ставит сносочный фрейм вниз полосы набора и подтягивает остальные фреймы «туда-сюда»;
4. расставляет индексы сносок в абзацах сносочного фрейма и повторяет их же в основном тексте.

Footnoter 0.9:
1. Вырезает предварительно выделенный в верстке текст (myDoc.selection=text).
2. Создает фрейм (myFootFrame) для сносок внизу полосы набора, вставляет туда содержимое буфера обмена, не обращая при этом внимания на источник содержимого и присваивает созданному фрейму значение обтекания текстом ini_TopWrapOffset (Footnoter.ini). Размеры создаваемого фрейма определяется согласно следующим правилам:
- выделен текстовый фрейм (myDoc.selection=textFrame), текст (myDoc.selection=text) или курсор в тексте (myDoc.selection=insertionPoint) — фрейм со сносками ставится по ширине исходного текстового фоейма внизу полосы набора
- ничего не выделено — сносочный фрейм ставится по ширине полосы набора, либо в крайнюю правую/крайнюю левую колонку полосы (в случае многоколонного макета и включенной в файле Footnoter.ini опции ini_FootByColumn = true);
- высота фрейма подгоняется под добавляемый текст только в случае одиночности сносочного фрейма в цепочке фреймов (myFootStory).
3. Добавляет в публикацию абзацные стили для сносок Footnoter1, Footnoter2 и символьные FootnoterC1, FootnoterC2 с дальнейшей проверкой их наличия (однажды добавив, удовлетворяется, увидев имя – стили в дальнейшем можно редактировать как угодно);
4. При обнаружении на полосе фрейма со сносками, созданного при предыдущих запусках скрипта, добавляет содержимое буфера обмена в готовый фрейм с автонумерацией вновь добавляемого текста. Наличие фрейма определяется через свойство label текстового сносочного фрейма: myFootFrame.label = "Footnote" (присваивается каждому вновь создающемуся сносочному фрейму).
5. Расставляет индексы сносок с возможностью перенумерации и изменения типа индексов. Если верстальщик изменяет индекс (номер) первого абзаца сноски на развороте и/или значение ini_FootSymbolsType в файле Footnoter.ini, то при следующем запуске скрипта остальные индексы переопределятся автоматически.
6. Добавляет индекс сноски в основной текст (только в случае myDoc.selection=text или myDoc.selection=insertionPoint).

Footnoter 0.9 НЕ УМЕЕТ:
1. Перенумеровывать и вообще осуществлять какой-либо контроль за индексами в основном материале.
2. Расставлять индексы сносок вида "i,ii,iii,iv..." (латинская нумерация)
3. Разверстывать сносочные фреймы по нескольким разворотам и привязывать их к основному материалу.

Очевидно, что эти возможности должны быть реализованы в ближайшем будущем. Не менее очевидно, что свойствами JavaScript это сделать обременительно. Нужен как минимум класс объектов – Footnote со всем множеством свойств и методов (а их действительно множество). Возможно, что реализация всего перечисленного является вопросом скорее для плагино- нежели скриптописателей. В идеале в InDesign должен появиться инструментарий работы со сносками, аналогичный MS Word. Не очень понятно почему все это не было реализовано в ID CS.

Настоящий скрипт выходит под номером 0.9, может содержать ошибки и не является каким-либо конечным продуктом. Скорее это пища для размышлений dtp-community.

С уважением,
 
Ответ: Новый скрипт: Footnoter

Выложен на InDesign.rudtp.ru.
Надеюсь, автор не против :)
 
Ответ: Новый скрипт: Footnoter

vbatushev сказал(а):
Надеюсь, автор не против :)
Собственно, для выкладывания здесь скрипт тебе и отправлял. Стормозил про возможность аттача файлов непосредственно в сообщении.

Скрипт запускал? Есть замечания, комментарии, соображения?

Onger сказал(а):
А может возмеш часть функциональности из этих скриптов http://www.guyverville.com/html/scripts.php
Спасибо, ценная информация. Интересный подход у этого Гая Вервиля реализован. Большую работу проделал, респект ему. Только как то все долго и сложно у него происходит. Сначала в ворде масса манипуляций и в результате не совсем корректные тэговые тексты, которые надо еще руками причесывать, затем три скрипта в Инди... Зачем-то в одной упряжке скрипты для Вентуры и Инди.

Тем не менее идея понятна. Стоит не просто вставлять сноски, а вытаскивать их из ворда и по возможности скопом. Но, мы пойдем другим путем! ;)
 
Ответ: Новый скрипт: Footnoter

а ты посмотрел тот который я на webfile выложил — он еще более продвинутый
 
Ответ: Новый скрипт: Footnoter

Ой. Спасибо что мордой ткнул. Отличная весчь. Подумал было, что на webfile лежит просто все в одном архиве. Несовершенство интер-фейса, елы-палы. ;-) Получается, что велосипед сегодня принялся изобретать. Идея та же - импортируем текст из ворда со сносками. Вручную выделяем блок (Footnotes) в конце материала и разверстываем. Реализация линеек через таблицы в сносочном фрейме. С таблицами в сносках удобнее работать по многим соображениям и дальше. Ниже сегодняшнее начало велосипеда, продолжение к которому теперь писать не вижу смысла, и некоторые соображения по поводу следующего.

- servo for insertion of footnote references & contents
- posibility to continue broken formatting
- automatic replace paragraph ends in multi-paragraph footnotes
- consistency check for reference numbers in both stories

Set myInDesign = CreateObject("InDesign.Application.CS")
Set myDoc = myInDesign.ActiveDocument
If myInDesign.Selection.Count > 0 Then
Set mySelection = myInDesign.Selection.FirstItem()
If TypeName(mySelection) = "Text" Then
If mySelection.Characters.Count > 0 Then
Set myStory = mySelection.ParentStory
Set myFootStyleChar = myDoc.CharacterStyles.Item("Знак сноски") 'CharacterStyle, импортрированный из ворда
Set myFirstPage = myStory.TextFrames.LastItem().Parent
Set myFootText = mySelection.Texts.LastItem()
myInDesign.Copy
Set myFootFrame = myFirstPage.TextFrames.Add
myInDesign.Selection = myFootFrame.InsertionPoints.FirstItem()
myInDesign.Paste

myInDesign.FindPreferences.AppliedCharacterStyle = myFootStyleChar
Set myFoundItems = myFootFrame.ParentStory.Search
myFootFrame.GeometricBounds = myStory.TextFrames.FirstItem().GeometricBounds
For i = 1 To myFoundItems.Count
myFoundItems.Item(i).Contents = "{" + myFoundItems.Item(i).Contents 'в одной строке таблицы окажутся строго пункты сноски (возможно из нескольких абзацев)
Next i
Set myFootTable = myFootFrame.Texts.FirstItem().ConvertToTable("}", "{", 1)
myInDesign.FindPreferences.AppliedCharacterStyle = idNothing
Set myFoundItems = myFootFrame.Search("^p^p", False, False, "^p")
With myFootTable
.HeaderRowCount = 1
.BreakFooters = idInAllTextColumns
.Rows.FirstItem().Split (1986359924) 'делим заголовок таблицы
End With

Set myFootHeaderCell = myFootTable.Cells.FirstItem()
myFootHeaderCell.TopEdgeStrokeWeight = "0.5 pt"

myFootFrame.Fit idFrameToContent
myInDesign.Selection = myFootFrame
End If
End If
Else
MsgBox "Select the (Footnotes) text at end of story and try again"
End If


Строка-заголовок таблицы, разбитая на две (три) вертикальные части, служит для управления длиной отбивающей сноску линейки. Пункты сносок, размещенные каждые в отдельной строке, легко перемещать из фрейма в фрейм по многополосной myFootStory.

Script DOES NOT CHECK for proper order of footnote’s numbers in references in main story with same in footnote story.
Для разверстки сносок в соответствии с их индексами в основном тексте необходимо связывать индексы в тексте с соответствующими строками таблиц в myFootStory. С этой целью нужно прописывать уникальную информацию в сами символы индексов.

Это было бы на раз, имей объект Character свойство label, но его нет. Можно хранить уникальную информацию о символах в редко используемых свойствах объекта Character. Наиболее подходящим кандидатами для этой цели видятся свойства UnderlineGapTint As Double и StrikeThroughGapTint. Массовая работа со сносками ведется в основном в книжных изданиях, где такие красивости как оттенок промежутков подчеркивающей линии, отличный от белого, и оттенок линии зачеркивающей, отличный от цвета основного текста, не так уж и необходимы. Свойство StrikeThroughGapTint становится активным только в случае явного указания цвета зачеркивания, но значения оттенка через скрипт нам поменять никто не мешает.

Допустимые значения обеих свойств от 0 до 100. В них можно хранить любую числовую информацию. В нашем случае – уникальный ID ячейки таблицы. Но ID бывают гораздо больше 100. Поэтому связать ячейку с индексом можно так:
myFootIndexChar.StrikeThroughGapTint = myFootCurrrentCell.ID/1000

Обратная операция - обращение к ячейке таблицы на основании найденного в основном тексте индекса:
Set myFootCurrrentCell = myFootTable.Cells.ItemByID (myFootIndexChar.StrikeThroughGapTint * 1000)


Удачного кода!

PS: Пошел придумывать еще какой-нибудь самокат :p . Если что – goldyz@yandex.ru
PPS: А VB по-любому толковее JS…
 
Ответ: Новый скрипт: Footnoter

Onger

Как обстоят дела с расширением функциональности Вашего скрипта? Может быть, всем миром навалимся и таки сделаем полноценный Footnoter, эквивалентный ворду?
 
Ответ: Новый скрипт: Footnoter

К сожалению это не мой скрипт (автор находиться на этом сайте http://www.suwalski.pl/dtp), так что если расширять функциональность то прийдется связыватся с автором (mailto:dtp@suwalski.pl) и просить исходники или брать за основу его алгоритм и писать заново с расширением функциональности.
 
Ответ: Новый скрипт: Footnoter

Проще доделать. Алгоритм понятен. Бери мяч и х..чь...

Для разверстки сносок в соответствии с их индексами в основном тексте необходимо связывать индексы в тексте с соответствующими строками таблиц в myFootStory. С этой целью нужно прописывать уникальную информацию в сами символы индексов.

Поковырявшись c xml, понял что эта задача отлично решаема именно через xml. Каждой сноске ставим в соответствие свой xml.element. Привязка к индексу в тексте тоже на раз. Через xmlAttribute можно реализовывать разные виды сносок и разные системы нумерации даже на одном развороте.
 
Ответ: Новый скрипт: Footnoter

Значит ли это, что файл для помещения в публикацию должен быть в формате XML?
 
xml

Совершенно не значит. При помощи скриптов (как впрочем и без) можно в любой моент добавлять в xml что угодно и присваивать любым элементам публикации произвольные xml-тэги, связывая их с xmlElement или xmlItem.

См. описание следующих объектов в InDesign CS Scripting Guide.pdf:
- xmlAttributes/xmlAttributes
- xmlComment/xmlComments
- xmlElement/xmlElements
- xmlItems/xmlItems
- xmlTag/xmlTags

Помимо этого в свойствах объекта document присутствует associatedXMLElement (read only).

Область просмотра xml-элементов открывается через View -> Structure -> Show Structure (alt-ctrl-1) или вытягиванием левой рамки окна InDesign. В данном случае это даст возможность просмотра всего списка сносок одномоментно (а-ля ворд).

По неизвестной причине включение опции Show Tag Markers серьезно тормозит процес и делает работу практически невозможной. Show Tag Markers было бы полезным для визуализации индексов сносок в основном тексте.

Ниже пример кода, иллюстрирующий использование xml. Скрипт предназначен для других целей и приводится исключительно для наглядности.

PHP:
with (app) {
var myDoc = activeDocument;
var myYP1 = myDoc.xmlItems.item(0).xmlItems.item(0).xmlItems;

/* ... */
var isFind = false;
for (i=0; i< myYP1.length; i++) {
	for (j=0; j< myYP1.item(i).xmlItems.length; j++) {
		if (myYP1.item(i).xmlElements.item(j).markupTag.name != "Head") {
			var myElement = myYP1.item(i).xmlItems.item(j).xmlElements.item(0);
			if (myElement.xmlAttributes.item(0).value == myID) {
				myElement.select(SelectionOptions.Replace);
				isFind = true;
			}
		}
	}
	if (isFind) {break;}
}
}
 
Ответ: Новый скрипт: Footnoter

Onger сказал(а):
а ты посмотрел тот который я на webfile выложил — он еще более продвинутый

А "более продвинутый" лежит еще где-нибудь? А то на вебфайле уже его нету... Можно ли заинтересованным тоже как-нибудь его заполучить?
 
Ответ: Новый скрипт: Footnoter

GoldyZ

Как продвигается работа над скриптом?
 
Ответ: Новый скрипт: Footnoter

О, спасибо большое. Попробуем освоить...
 
Ответ: Новый скрипт: Footnoter

Гoспoдa, дoбрoгo времени сутoк всем! Я, к сoжaлению, не принaдлежу к слaвнoй кoгoрте скриптoписaтелей, a являюсь прoстым верстaлoй, к тoму же, рaбoтaю нa Мaке. O-ч-ч-ень меня зaинтересoвaл этoт скрипт, нaстoлькo, чтo не пoжaлел нескoлькo чaсoв и зaстaвил егo рaбoтaть нa мoей мaшине (MacOS X 10.2.2, InDesign CS ME, языкoвые мoдули: Иврит, Aнглийский, Русский, Aрaбский). Речь, кoнечнo, o Footnoter 9.0. Дoлжен зaметить, чтo скрипт рaбoтaет нa вёрсткaх нa иврите и aрaбскoм! Aвтoр, нaвернoе тaкую вoзмoжнoсть и не предусмaтривaл.
Oчень хoчется пoпрoбoвaть "прoдвинутую" версию, oднaкo .EXE фaйлы нa Мaкaх не рaбoтaют: нужен .Js кaк и в 9.0 версии. Буду весьмa признaтелен
 
Статус
Закрыто для дальнейших ответов.