[ID CS4-CS6] Выделение подзаголовков и вопросов в интервью

kvg7777

Топикстартер
10 лет на форуме
Сообщения
26
Реакции
0
Для выделения вопросов в интервью полужирным я придумал это, может кто-то предложит что-то лучше?
Понятно что этот вариант сработает далеко навсегда корректно, к примеру, если ответ оканчивается вопросом, он его тоже выделит...

app.changeGrepPreferences.fontStyle = 'Bold' //задание для замены атрибута полужирного шрифта
app.findGrepPreferences.findWhat = "^(.+?)(?>\\?\\r)"
app.changeGrepPreferences.changeTo = "$0"
mySel.changeGrep()
app.changeGrepPreferences.fontStyle = NothingEnum.nothing //Отмена полужирного для замены атрибута полужирного шрифта


Кто подскажет, как к примеру задать стиль подзаголовку?
Если мы знаем, что это строка с текстом перед которой идет пустой абзац?
 

Любимцев

15 лет на форуме
Сообщения
4 206
Реакции
2 057
я не уверен... но, по термину "полужирного шрифта" ... как-то мерещится, что велосипед тут изобретаете (
 

kvg7777

Топикстартер
10 лет на форуме
Сообщения
26
Реакции
0
Неужели никто ничего дельного не посоветует?
Как скриптом задать стиль подзаголовку, если известно, что это строка с текстом перед которой идет пустая строка?
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Почему же не посоветуем? Посоветуем!
Вот такой греп:
(?<=\r\r).+(?=\r)
Заменить на: искомый стиль абзаца или символа.
Обработает все абзацы, перед которыми идет хотя бы одна пустая строка.
Перед самым первым абзацем во фрейме обычно нет пустой строки, он под этот критерий не попадает, придется поправить вручную.
 

Вложения

  • 2019-10-31_020719.png
    2019-10-31_020719.png
    184.9 КБ · Просм.: 427
  • Спасибо
Реакции: kvg7777

veretragna

γνώσις
Сообщения
578
Реакции
200
Если нужно присвоить стиль второму абзацу (после которого идет пустая строка), то греп нужен немного другой:
^.+(?=\r\r)
Здесь не обработается последний абзац во фрейме, если после него нет пустой строки.
 

Вложения

  • 2019-10-31_020006.png
    2019-10-31_020006.png
    48 КБ · Просм.: 278
  • Спасибо
Реакции: kvg7777

kvg7777

Топикстартер
10 лет на форуме
Сообщения
26
Реакции
0
Почему же не посоветуем? Посоветуем!
Вот такой греп:
(?<=\r\r).+(?=\r)
Заменить на: искомый стиль абзаца или символа.
Обработает все абзацы, перед которыми идет хотя бы одна пустая строка.
Перед самым первым абзацем во фрейме обычно нет пустой строки, он под этот критерий не попадает, придется поправить вручную.

Большое спасибо!

app.changeGrepPreferences.fontStyle = 'Bold'
app.findGrepPreferences.findWhat = "(?<=\\r\\r)(.+)(?=\\r)"
app.changeGrepPreferences.changeTo = "$0"
mySel.changeGrep()

Если задать полужирным это работает, остался вопрос: как стиль абзаца поменять на нужный???
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Чем не подходит простая замена через форму поиска? На скриншотах показан рабочий вариант, чем он вам не подходит?
 

kstati

иɯɐɯɔʞ
10 лет на форуме
Сообщения
1 138
Реакции
512
Если задать полужирным это работает, остался вопрос: как стиль абзаца поменять на нужный???
Найти объект стиля и прописать его. Пример ниже выдернул из своего скрипта, немного перепилив. Ловите суть
JavaScript:
/** Функция для поиска стиля параграфа с учётом возможного расположения внутри группы */
function DeterminateParagraphStyle(StyleName) {
    /** hint app.activeDocument.paragraphStyleGroups.item('Summary').paragraphStyles.item('Su_Para_*' ); */
    var retval = "";
    if (StyleName == "") return "";
    if (StyleName.indexOf("/") == -1) {
        /** Стиль не вложенный */
        retval = myDoc.paragraphStyles.itemByName(StyleName);
    } else {
        /* Стиль Вложенный */
        var parts = StyleName.split("/");
        var grp = myDoc.paragraphStyleGroups.item(parts[0]);
        var style = grp.paragraphStyles.itemByName(parts[1]);
        retval = style;
    }
    return retval ? retval : "";
}

app.changeGrepPreferences.appliedParagraphStyle = DeterminateParagraphStyle(StyleName)
 
Последнее редактирование:
  • Спасибо
Реакции: kvg7777

kvg7777

Топикстартер
10 лет на форуме
Сообщения
26
Реакции
0
УУУРРРААААА, ЗАРАБОТАЛО! :)
Спасибо огромное!

mySel = selection[0]
app.changeGrepPreferences.appliedParagraphStyle = "Подзаголовок внутренний" \\В моем случае имя стиля Подзаголовок внутренний
app.findGrepPreferences.findWhat = "(?<=\\r\\r)(.+)(?=\\r)"
app.changeGrepPreferences.changeTo = "$0"
mySel.changeGrep()
app.changeGrepPreferences.appliedParagraphStyle = NothingEnum.nothing \\Отмена стиля
 

veretragna

γνώσις
Сообщения
578
Реакции
200
На этом форуме принято вот так
 

Вложения

  • 2019-10-31_170604.png
    2019-10-31_170604.png
    93.8 КБ · Просм.: 442

kvg7777

Топикстартер
10 лет на форуме
Сообщения
26
Реакции
0
Все пытаюсь совершенствовать... :)
Вопросы в интервью, как оказывается на практике, довольно часто оказываются вовсе не вопросами ;), а могут оканчиваться точкой или отточием...
Тут наверное логичнее сделать выделение абзацев, начинающихся с тире через один...
Кто-нить примером подскажет как лучше реализовать? Цикл или как-то еще?
Надо выделять абзац, начинающийся с тире через один и присваивать ему "BOLD".
 

densen

15 лет на форуме
Сообщения
753
Реакции
642
Надо выделять абзац, начинающийся с тире через один и присваивать ему "BOLD".
Сейчас так и происходит. Скрипт не смотрит на знаки препинания.
app.findGrepPreferences.findWhat = "(?<=\\r\\r)(.+)(?=\\r)" - ищется текст между двойным возвратом каретки и одинарным, и всему этому тексту присваивается стиль. Этот текст и будет абзацем, который является вопросом интервьюера.
 
  • Спасибо
Реакции: kvg7777

kvg7777

Топикстартер
10 лет на форуме
Сообщения
26
Реакции
0
Сейчас так и происходит. Скрипт не смотрит на знаки препинания.
app.findGrepPreferences.findWhat = "(?<=\\r\\r)(.+)(?=\\r)" - ищется текст между двойным возвратом каретки и одинарным, и всему этому тексту присваивается стиль. Этот текст и будет абзацем, который является вопросом интервьюера.
у нас не используются разрывы между вопросами... просто вопрос начинается и тире и ответ с тире, когда вопрос выделен, лишние разрывы ни к чему...
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Код:
var myStory = app.selection[0].parentStory;
var allParas = myStory.paragraphs.everyItem().getElements().slice(0);
var allInterviewParas = [];

var questionStyle = app.activeDocument.paragraphStyles.itemByName("QuestionStyle");

for(var i=0;i<allParas.length;i++)
{
    if(allParas[i].contents.indexOf("— ")==0) allInterviewParas.push(allParas[i]);
}

for(var i=0;i<allInterviewParas.length;i++)
{
    if(i%2==0) allInterviewParas[i].appliedParagraphStyle = questionStyle;
}

имя стиля замените на свое, выделять нужно фрейм

не проверял, но должно работать
 
  • Спасибо
Реакции: kvg7777, densen и Drawer

Любимцев

15 лет на форуме
Сообщения
4 206
Реакции
2 057
вопрос выделен, лишние разрывы ни к чему...
То разные абзацы — то "ни единого разрыва"...
Но в любом случае, вам нужен Character Style ... зачем плодить лишние абзацные, если вопрос от ответа отличается лишь начертанием...

Но если все же:
как лучше реализовать? Цикл или как-то еще?
тогда юзайте Next Style …
 
  • Спасибо
Реакции: kvg7777 и densen

iv-mi

15 лет на форуме
Сообщения
563
Реакции
375
Код:
var myStory = app.selection[0].parentStory;
var allParas = myStory.paragraphs.everyItem().getElements().slice(0);
var allInterviewParas = [];

var questionStyle = app.activeDocument.paragraphStyles.itemByName("QuestionStyle");

for(var i=0;i<allParas.length;i++)
{
    if(allParas[i].contents.indexOf("— ")==0) allInterviewParas.push(allParas[i]);
}

for(var i=0;i<allInterviewParas.length;i++)
{
    if(i%2==0) allInterviewParas[i].appliedParagraphStyle = questionStyle;
}

имя стиля замените на свое, выделять нужно фрейм

не проверял, но должно работать
А в строке сбора абзацев в массив
var allParas = myStory.paragraphs.everyItem().getElements().slice(0);
оператор .slice(0) какую задачу решает (или должен решать)?
У меня что с ним, что без него результат одинаковый. Но может быть, я чего-то не заметил.
 
  • Спасибо
Реакции: kvg7777

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
А в строке сбора абзацев в массив
var allParas = myStory.paragraphs.everyItem().getElements().slice(0);
оператор .slice(0) какую задачу решает (или должен решать)?
У меня что с ним, что без него результат одинаковый. Но может быть, я чего-то не заметил.

Разница в скорости выполнения, заметна на больших объемах. После slice специфаеры намертво ресолвятся (пардон мой русский), а без него индизайн при каждом обращении ищет объекты. По крайней мере, я так понял.
 
  • Спасибо
Реакции: kvg7777

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Mark Autret автор оптимизации, по-моему, можно у него на сайте найти подробное объяснение, если покопаться
 
  • Спасибо
Реакции: kvg7777 и iv-mi

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Peter Kahrel wrote:
> But as a matter of interest, what's the ".slice(0)" doing there at the end of the first line?
>

I'm not sure if it really makes a difference in this case (I've never
bothered to check), but here's an article written by Kris Coppieters
which explains the idea behind it...
http://www.niemannross.com/developer/wiki/index.php?title=Avoiding_slowness_with_object_arrays

and here's one on collections:
http://www.niemannross.com/developer/wiki/index.php?title=Converting_a_collection_into_an_array

FWIW, I use this function to get an array when I deal with a large
number of objects and I don't specifically need a dynamic collection
over an array. I don't need to worry about whether I'm starting out with
an array or a collection and the difference in performance is tremendous:

function AsArray(collection){
if(collection instanceof Array){return collection.slice(0)}
return collection.everyItem().getElements().slice(0);
}

--
Harbs

ссылки нерабочие, правда
 
Последнее редактирование:
  • Спасибо
Реакции: kvg7777

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Peter,

Your question finally prompted me to do some timing tests:

I created 400 text frames for testing purposes.

Accessing pageItems to check if they were text frames took about 20
times as long when they were collections than with
everyItem().getElements(). adding the "slice(0)" cut the time by about a
third. So slice(0) doesn't make a very big difference in this case, but
it does make a difference...

--
Harbs
 
  • Спасибо
Реакции: kvg7777