Помощь - Поиск - Пользователи - Календарь
Полная версия: Секция академической GREPли :)
ProDTP > Графика и препресс > Adobe InDesign
Страницы: 1, 2, 3, 4
arhip
Какие другие симптомы имеются? Любую латиницу не ищет? Символы? А если не в GREP?
У меня ощущение, что это вопрос не для темы про GREP.
yann777
Текст и глиф ищет любые. GREP только русские и метасимволы.
andrej
помогите сирому и убогому(

в ГРЕП-вкладке такая конструкция работает

find what
(?<=\>) ч(?=\>)

change to
ч
+no break

а в FindChangeList
grep {findWhat:"(?<=\>) ч(?=\>)"} {changeTo:" ч", noBreak:true} {includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false}

нет...
PAIN.(t)
Та же история… табуляторы в качестве разделителей (хотя, может это движок форума их скушал) и двойные слеши…
Рабочая конструкция:
grep<tab>{findWhat:"(?<=\\>) ч(?=\\>)"}<tab>{changeTo:" ч", noBreak:true}<tab>{includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false}
PAIN.(t)
Довольно часто на просторах сети можно встретить вопросы типа: "можно ли автоматически разбить большие числа на группы по три разряда (знака)?"
Вчера нам с Борисом Кащеевым (aka putnik) удалось найти решение этой задачи, которое оказалось на редкость простым.
Сводится оно к нескольким (зависит от ситуации) GREP-конструкциям.

1. Основная замена
Find what: (?<!\.|,)\<(\d{1,})(\d{3})\>
Change to: $1~4$2
Эта процедура выполняется несколько раз, до тех пор, пока число сделанных замен не станет равным нулю (т.е. будут обработаны все присутствующие в материале числа).

2. Дополнительная замена
Тестируя GREP-запрос, Борис заметил, что если поиск ведется в выделенном фрагменте (Search = Selection), и число находится в начале выделения; то такое число обработано не будет. В случае с Search = Story или Search = Document данный баг отсутствует. Фиксится этот баг дополнительной заменой:
Find what: ^(\d{1,})(\d{3})\>
Change to: $1~4$2
Аналогично предыдущему, этот запрос выполняется несколько раз.

3. Дополнительная замена-2
Также по условиям задачи, поставленной Борисом, не должны разбиваться четырехзначные числа (диапазон 1000-9999).
Find what: \<(\d{1})~4(\d{3})\>(?! \d)
Change to: $1$2
Опционально (зависит от требований вашего литредактора/корректора). Выполняется один раз.

Обратите внимание!!!
— в примерах числа разбиваются четвертькегельной шпацией (~4). Если необходимо использовать другие пробельные элементы – вносите в запрос соответствующие изменения.
— запросы не должны начинаться с пробелов.


И, наконец, приятная новость для лентяев smile.gif
Борис автоматизировал процесс, написав скрипт, выполняющий все замены автоматически, нужное число раз, и с возможностью выбора нужного пробельного элемента.
Скачать его можно здесь.
PAIN.(t)
Апдейт к предыдушему сообщению:
Стараниями Бориса скрипт обновлен, на сайте доступна новая версия.
Немного расширен функционал; исправлен серьезный баг, проскочивший по моей вине – дробная часть числа (после запятой) теперь не разбивается.
Всем, кто скачал старую версию, рекомендую обновиться.
yann777
Эксперты, как в FindChangeList прописать поиск какого-либо начертания шрифта (болд или италик или андерлайн)?
PAIN.(t)
На примере GREP-а:
С начертаниями все просто и понятно.
Код
grep    {findWhat:".", fontStyle:"Bold"}
grep    {findWhat:".", fontStyle:"Italic"}
grep    {findWhat:".", fontStyle:"Bold Italic"}


Немного другая история с underline и strikethrough – они по природе своей являются не начертаниями гарнитуры, а приемами выделения. Соответственно, и ищутся в другом месте smile.gif
Код
grep    {findWhat:".", underline:true}
grep    {findWhat:".", strikeThru:true}
arhip
Пытаюсь создать поиск, который находил бы марки самолётов и делал дефис в них неразрывным. И натыкаюсь на одну странность. Похоже на ошибку в GREP.
Код
Найти: (?<=(?-i)Ту|Ил|МиГ)-
Заменить на: ~~

Т.е. ищется дефис при условии, что перед ним стоит "Ту" или "Ил" или "МиГ" (на всякий случай включил поиск с учётом регистра). И дефис меняется на неразрывный. Всё просто. Но GREP спотыкается на "МиГ"!

Я пробовал разные варианты, включал-выключал учёт регистра, менял порядок слов, ставил ограничение на поиск только в начале слова, даже заменял дефис на "любой знак" (.) — либо поиск вообще не даёт результата, либо вместо дефиса находится буква "Г" в слове "МиГ". Такое ощущение, что GREP не понимает, как это прописная буква может быть не в начале слова, а в конце.

Есть предложения, как выкрутиться?

Пока я не придумал ничего лучше как зайти с другой стороны и искать... дефис с последующей цифрой smile.gif
Код
Найти: -(?=\d)
Заменить на: ~~

По идее, это должно подойти для всех случаев. Вообще рекомендую его к широкому повсеместному применению. Или подскажите какое-нибудь исключение, когда такая замена может быть вредной.

Но вопрос остаётся открытым, хотя бы из теоритического интереса: как искать сочетания типа "МиГ" в lookbehind (lookahead вроде работает)?

Версия ID CS3.
t34
А если искать Ми + любая буква?
PAIN.(t)
Я еще в самом первом посте писал, что больно уж все смахивает на то, что с lookbehind Адоба что-то хорошенько нахомутала…
Насчет прописной буквы в конце – неверно. Я отключал чувствительность к реестру, менял ее на строчную – результат тот же.
Как выкрутиться: откажись от lookbehind-а.
Код
Find What: (Ту|Ил|МиГ)(-)
Change To: $1~~
arhip
Да, Юра, действительно, в данном случае можно и так, спасибо.

Кстати, с тем же lookbehind я снова наткнулся на проблему, когда составил поиск замены дефиса на тире в выражениях "поверхность-воздух", "воздух-воздух", "поверхность-поверхность". В параметрах lookbehind и lookahead задавал "поверхность|воздух" (без кавычек, конечно) — и это не работало. Ищет только по первому слову вроде. Да, с твоей подсказки вижу, что можно выкрутиться через поиск трёх групп,
Код
(поверхность|воздух)(-)(поверхность|воздух)

но всё равно обидно — Адобы налажали. Надеюсь, в CS4 поправили. Проверить не могу.
PAIN.(t)
Нет, в CS4 все точно так же. Я как раз в четвертом и смотрел…
Вечерком буду посвободнее – забью погоняю эти выражения RegexBuddy и PowerGREP-ом.
Посмотрим, что там нам скажут… Тогда уже будет яснее, кто косячит.

PS. и находочку свою, запости сюда, пожалуйста… раз уж сам Борис молчит smile.gif
SsoulmanN
Подскажите, плиз, где найти Полный перечень метасимволов GREP и примеры составление (ссылки в данном посте, указаные ранее \100кБ\ - не работают, а по запросам в Яндексе, чет ничего путного нету(((
Toyava
Скажите, а таблица на четыре страницы в мануале вам не попадалась на глаза?
А сам мануал имеет привычку попадаться здесь: http://help.adobe.com/ru_RU/InDesign/6.0/i...gn_cs4_help.pdf
arhip
Цитата(PAIN.(t) @ Mar 16 2009, 20:28) *
PS. и находочку свою, запости сюда, пожалуйста… раз уж сам Борис молчит smile.gif

Ну, находка не моя, я только объяву дал ))

Для тех, у кого возникают сложности при переносе индизайновских GREP-запросов в набор FindChangeByList.jsx, есть скрипт, который сделает это за вас — RecordFindChange_CS3.jsx. Подробности у наших добрых соседей.
putnik
Кто использовал модифицированный скрипт FindChangeByLists, который в одном файле FindChangeList.txt позволял организовать несколько списков поиска-замены, пожалуйста обновитесь здесь. Работает как в CS3, так и в CS4.
Изменения: а) моя обвязка перенесена на программный код FindChangeByList, который в составе ID CS4; б) Исправлены мелкие логические ошибки; в) удобный выбор нужного файла поиска/замены, если их у вас несколько.
Пожалуйста, сообщайте о найденных ошибках (если таковые появятся) на почтовый ящик, который указан в теле скрипта.
PAIN.(t)
Борис, спасибо!
Надеюсь чаще видеть вас в этом топике: как с вашими наработками, так и с проблемами – в меру возможностей постараемся помочь с их решением.
yann777
Цитата(yann777 @ Dec 11 2008, 16:46) *
GREP не ищет английские буквы. Чё делать? Как быть? Где копать?

ВНИМАНИЕ!
Нашёл в чём проблема. Я пользуюсь скриптом FindChange_Multilist.exe (автор Юрий Васильев). Всё отлично. Но... После применения скрипта GREP отказывается искать англицкие буковки. sad.gif  Помогает перезагрузка Индизайна. Возможно автор скрипт и доработает.
PAIN.(t)
yann777
Спасибо за сигнал. Постараюсь выявить и исправить баг в коде.
PAIN.(t)
yann777 & all
Скрипт поправил, отправил Борису – при первой же возможности исправленная версия скрипта будет выложена на сайте.
Пока можно забрать ее отсюда.

Теперь пару слов в защиту себя-любимого smile.gif
Баг не мой, "достался в наследство" от штатного Адобовского FindChangeByList.vbs для CS3 (впрочем, и за FindChangeByList.jsx такой же грешок замечен) – напомню, что движок скрипта я не изменял, а всего-то навсего прикрутил к нему интермордочку. Проверил штатные скрипты на машине, к которой мои очумелые ручки никогда не прикасались – симптоматика та же.
Провоцируют такое неподобство со стороны ИнДеза встречающиеся в коде строки типа:
Код
myInDesign.FindChangeTextOptions = idNothingEnum.idNothing

Независимо от того, где такая строка встречается в коде, и производятся ли в дальнейшем какие-либо обращения к классам
Код
myInDesign.FindChange(Text/Grep/Glyph)Options…

возможность поиска в тексте латинских символов (а может, и не только их) посредством GREP-а после выполнения такого скрипта отрубается напрочь (до перезагрузки приложения).
"Проблемные" строки были убраны из кода, а сам код скрипта немножко изменился: теперь в начале выполнения он запоминает параметры поиска (как то: поиск на мастер-страницах, в сносках и т.д.), а перед выходом – восстанавливает исходные.
Однако, в связи с тем, что теперь не выполняется "обнуление" этих параметров перед выполнением каждого запроса из вашего листинга, я рекомендую в запросах прописывать их все явно.

Ну, вроде бы, на сегодня все…
putnik
Цитата(PAIN.(t) @ Mar 26 2009, 20:00) *

yann777 & all
Скрипт поправил, отправил Борису –

Уже выложил на сайт
PAIN.(t)
putnik
Борис, спасибо!

arhip
Цитата
погоняю эти выражения RegexBuddy

Дык, вот… Добрался я наконец-то до сабжа…

IPB Image

Как видно на скриншоте – выражение составлено абсолютно верно (Ту и МиГ-и просто не уместились на скриншоте).
То, что оно и ему подобные не работают в ИнДезе – заслуга Адобовских программеров (корявая реализация lookbehind-а).

UPD: заменил скриншот на более удачный.
andrej
ну... у меня цс3 перестаёт искать латинские символы
после банальных скриптов со строкой
app.scriptPreferences.version = 4;

после этого - каюк... grep перестаёт напрочь работать
PAIN.(t)
Можно пример заведомо "сбойного" скрипта?
andrej
да запросто) кусок кода в начале...

app.scriptPreferences.version = 4;

with (app) {
    myStory = selection[0].parentStory;
   
    // Заменяем жирное форматирование символов на символьный стиль "Bold"
    findPreferences = null;
    changePreferences = null;
    findPreferences.fontStyle = "Bold";
    changePreferences.appliedCharacterStyle = activeDocument.characterStyles.item("Bold");
    myStory.search("^?", false, false, "");
    findPreferences = null;
    changePreferences = null;
}

после этого - в цс3 перестаёт работать grep
PAIN.(t)
Угу, зафиксировал такую багу…
Ну с этим куском кода все решилось довольно просто – я пошел от обратного, и тупо прописал в конце
Код
app.scriptPreferences.version = 5;

т.е. после выполнения скрипта в эмуле более старой ОМ, вернул "родную" объектную модель.
После этого глюк пропал…

Прокатит ли такой фокус с другими скриптами – пробуйте.
arhip
Цитата(PAIN.(t) @ Mar 26 2009, 20:56) *

arhip
Добрался я наконец-то до сабжа…

Спасибо, Юр, буду иметь в виду.
yann777
PAIN.(t)
Спасибо!
arhip
Цитата(arhip @ Mar 16 2009, 03:05) *
Пытаюсь создать поиск, который находил бы марки самолётов и делал дефис в них неразрывным. И натыкаюсь на одну странность. Похоже на ошибку в GREP.
Код
Найти: (?<=(?-i)Ту|Ил|МиГ)-
Заменить на: ~~

Я нашёл, как обойти эту проблему. Индизайн, как оказывается, спотыкается на количестве букв в lookbihind! Если составить несколько запросов, где варианты разобрать по кол-ву букв, то всё работает. 

Например, так:
Код
Найти: (?<=(?-i)Ту|Ил|По|Як|Ла)-
Заменить на: ~~

Найти: (?<=(?-i)МиГ|ЗИЛ|ГАЗ|ВАЗ)-
Заменить на: ~~
yann777
В запросах группировать по кол-ву букв? По две, по три и так далеее? Считаю - очень важная находка!
arhip
Именно так, группировать. И это была не первоапрельская шутка )) Впрочем, легко проверяется.
Любимцев
А о GREP-стилях, замолвите слово?
Я покумекал, и не вижу пока что он дает... Да можно назначить No Break пробелам после а, с, в... но сами-то пробелы он не добавит. "г.Москва" в "г. Москва" не превратится  unsure.gif
Как бы можно, на лету, локальному форматированию присвоить стили символов (и прописать это сразу в дефолтный стиль Абзаца) но, как искать италик, болд, GREP-стилем?
arhip
А Find Format на что? Или я вопроса не понял.

Кстати, этот запрос превратит "г.Москва" в "г. Москва" с неразрывным пробелом:
Код
Найти: (?<=\<г)\.(?=[A-Я])
Заменить на: .~S

Перевожу на человеческий: найти точку, перед которой стоит буква "г", являющаяся началом слова, а после точки — любая кириллическая прописная. Заменить точку на точку + неразрывный пробел.
Любимцев
Не, Алексей, не понял. Я толкую о GREP-стилях, кои в абзацных стилях тусуются
arhip
Не знаю, что это. Фишка из CS4? Я на него ещё не переполз.
Любимцев
Ну да, о CS4
PAIN.(t)
Цитата
Я покумекал, и не вижу пока что он дает...

Так ты сам все правильно сказал: ищет в текстовом массиве последовательности по определенной GREP-маске, и присваивает им символьный стиль.
Этакий продвинутый Nested Style, где вложенный фрагмент может находиться в произвольном месте абзаца…
Или эквивалент такой мульки:
Код
Find: что-то-там
Change To: $0 + форматирование Character Style-ом

Не более того.

Цитата
"г.Москва" в "г. Москва" не превратится

Нет, не превратится. Здесь нужен тот GREP, который в Find-Change сидит.

Цитата
как искать италик, болд, GREP-стилем

Никак. До этого Адоба еще не дошла…
GREP, сам по себе, вообще этого не умеет. Он всего-навсего инструмент поиска по маске, всяческие дополнительные атрибуты текста – ну никак не GREP-ова парафия…

GREP Styles хороши для подобных вещей (слева – исходник, справа – отформатировано в один клик):
IPB Image
Любимцев
Ок! Юр, Спасибо!
Просто эта тема не была тут, еще, затронута. Может кто продолжит.
Любимцев
Продолжая тему.
В GREP-стиле указано — "Все латинские", а во вложенном — "первое предложение"
GREP сбивает вложенный (то есть нужно как-то указать исключене — "кроме первого предложения")
IPB Image

Забегая вперед: следующие за латиницей цифры, так же должны быть Италиком. А вот следующие за ними русские в скобках, (перевод), но не цифры, должны быть удалены (возможно выделены цветом).
blink.gif
Tom_York
Люди помогите решить проблему
Есть куча таблиц
Нажмите для просмотра прикрепленного файла

Так вот не могу разобраться что написать между двумя выражениями

(Қазақстан Республикасы) ******* (Республика Казахстан)
Что цифры  сделать болдом?
arhip
Найти: (?<=Қазақстан Республикасы).*(?=Республика Казахстан)
Заменить: [Строка замены пустая. Включить свойство Bold в Change Format: Basic Character Format: Font Style]

?<= — "этот текст должен быть перед искомым, или positive lookbehind".
?= — этот текст должен быть после искомого, или positive lookhead".
. (точка) — любой символ.
+ — повтор предыдущего символа один или более раз.

Я надеюсь, это не реальная таблица, а набрано через табуляцию?
Tom_York
arhip вот именно реальная таблица
их сотни, большой объем страниц каждый месяц. И везде таблицы
arhip
Тогда я не знаю. Может быть, в CS4 grep работает с таблицами... Логичнее попробовать через стили таблиц.
Tom_York
Через стили не получается, так как все время разные шапки, и в некоторых таблицах, жирность не ставится.
В основном где общая статистика по кз.
vbatushev
А если тупо?
Искать:
(^\d+,\d+$)|(^~e$)|(^\.{3}$)
Заменить:
на стиль или болд

У тебя же просто нужно найти определенные наборы буквоцифр?

P.S. Ой, нет. Нужно ведь только первую строку. IMHO, только минискрипт рисовать.
Tom_York
Там даже не просто первую,
а именно где Казахстан, то есть в некоторых первая сторока не выделяется.
yann777
Цитата
Есть куча таблиц

Таблиц много? Или одна большая таблица? Может таблицу преобразовать в текст. Сделать нужные выделения (какая интересная фраза получилась). Потом обратно текст в таблицу.
Tom_York
Много в прямом смысле этого слова.
есть же еще шапки таблиц, которые состоят не из 1 строки.
в выложеном примере таблица без шапки
yann777
Как вариант - соединить таблицы
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2012 Invision Power Services, Inc.

Реклама

   Rambler's Top100    Яндекс цитирования