Поиск/замена в абзацах определенного стиля

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

Сергий Задонский

Участник
Топикстартер
Сообщения
251
Реакции
4
Подскажите, пожалуйста, можно ли (и как) осуществлять поиск/замену не во всем документе, а только в абзацах выбранного стиля? Т.е. задача такая: есть скрипт, который с помощью словаря расставляет ударения в церковнославянских текстах. Нужно, чтобы он работал не со всем текстом, а исключал из поиска заголовки и фрагменты на русском языке (т.е. фрагменты, отличающиеся стилем).
 
ну сделайте проверку, что-нибудь типа такого
if (app.activeDocument.selection[0].appliedParagraphStyle.name !== "Paragraph Style Name")
 
ну сделайте проверку, что-нибудь типа такого
if (app.activeDocument.selection[0].appliedParagraphStyle.name !== "Paragraph Style Name")
Я с этой проверкой, как мартышка с очками...*[[...куда не воткну - не фунциклирует... Посмотрите, пож. код. Куда ее втыкать?
Код:
#include AccentsTest.jsx /*Это словарь, типа: 
var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
return(accent);
})();
*/
if(app.documents.length != 0) {
var myDocument = app.documents[0];
var mySelection = app.selection[0];

myProblemColorSample = [0, 100, 100, 0];
myAbsentColorSample = [100, 0, 100, 0];

try{
    myColor = myDocument.colors.item("myAbsentColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myAbsentColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myAbsentColorSample});
    }
try{
    myColor = myDocument.colors.item("myProblemColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myProblemColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myProblemColorSample});
    }

var mySampleForSearchWord = "((?i)[аеиоуыюя]+[\\l\\u]*|[\\l\\u]*[аеиоуыюя][\\l\\u]*){2,}";/*Выбираем слова только из двух и более слогов*/
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;               
myFoundedWords = mySelection.findGrep();

if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение сверху вниз.
    for (j=0; j <= myFoundedWords.length-1; j++) { //  j >= 0
       
        myLine = myFoundedWords[j];
       
                var myWord = myAccent[myLine.contents.toLowerCase()]; // найденное слово  передается в ассоциативный массив
                                                           
              if (myWord == undefined) {// такого слова в ассоциативном масиве нет
                myLine.fillColor = "myAbsentColor";
                continue;
                }              
        if (myWord[0] == "*") { // возможны варианты написания этого слова
            myLine.fillColor = "myProblemColor";
            continue;
            }
     // проверка на заглавные буквы  
        if (myLine.contents[0] == myLine.contents[0].toUpperCase() ) {
        if (myWord[0] == "="){continue;}  // если слово начинается с заглавной ударной гласной, его не меняем 
          myWord = myWord[0].toUpperCase() +myWord.slice(1); // если с заглавной не ударной - меняем, но переводим в замене первую букву в верхний регистр       
            }
               
        // замена слова
        myLine.contents = myWord;      
        } // j >= 0
} // != 0
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\=(.)";
app.changeGrepPreferences.appliedFont = "New\tPlain";// New\tPlain - это шрифт, в котором все гласные с ударением
app.changeGrepPreferences.changeTo = "$1";
app.activeDocument.changeGrep();
}
else {
    alert ("Нет открытых документов");
    }

exit();
 
ну вставьте после поиска
соответственно "Paragraph Style Name" стиль параграфа который нужно исключить

Код:
#include AccentsTest.jsx /*Это словарь, типа:
var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
return(accent);
})();
*/
if(app.documents.length != 0) {
var myDocument = app.documents[0];
var mySelection = app.selection[0];

myProblemColorSample = [0, 100, 100, 0];
myAbsentColorSample = [100, 0, 100, 0];

try{
    myColor = myDocument.colors.item("myAbsentColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myAbsentColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myAbsentColorSample});
    }
try{
    myColor = myDocument.colors.item("myProblemColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myProblemColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myProblemColorSample});
    }

var mySampleForSearchWord = "((?i)[аеиоуыюя]+[\\l\\u]*|[\\l\\u]*[аеиоуыюя][\\l\\u]*){2,}";/*Выбираем слова только из двух и более слогов*/
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;              
myFoundedWords = mySelection.findGrep();

if (myFoundedWords.appliedParagraphStyle.name !== "Paragraph Style Name") {
if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение сверху вниз.
    for (j=0; j <= myFoundedWords.length-1; j++) { //  j >= 0
      
        myLine = myFoundedWords[j];
      
                var myWord = myAccent[myLine.contents.toLowerCase()]; // найденное слово  передается в ассоциативный массив
                                                          
              if (myWord == undefined) {// такого слова в ассоциативном масиве нет
                myLine.fillColor = "myAbsentColor";
                continue;
                }             
        if (myWord[0] == "*") { // возможны варианты написания этого слова
            myLine.fillColor = "myProblemColor";
            continue;
            }
     // проверка на заглавные буквы 
        if (myLine.contents[0] == myLine.contents[0].toUpperCase() ) {
        if (myWord[0] == "="){continue;}  // если слово начинается с заглавной ударной гласной, его не меняем
          myWord = myWord[0].toUpperCase() +myWord.slice(1); // если с заглавной не ударной - меняем, но переводим в замене первую букву в верхний регистр      
            }
              
        // замена слова
        myLine.contents = myWord;     
        } // j >= 0
} // != 0
} // !== "Paragraph Style Name"
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\=(.)";
app.changeGrepPreferences.appliedFont = "New\tPlain";// New\tPlain - это шрифт, в котором все гласные с ударением
app.changeGrepPreferences.changeTo = "$1";
app.activeDocument.changeGrep();
}
else {
    alert ("Нет открытых документов");
    }

exit();
 
там выше ошибся, проверку конечно же внутрь цикла нужно поставить
Код:
#include AccentsTest.jsx /*Это словарь, типа:
var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
return(accent);
})();
*/
if(app.documents.length != 0) {
var myDocument = app.documents[0];
var mySelection = app.selection[0];

myProblemColorSample = [0, 100, 100, 0];
myAbsentColorSample = [100, 0, 100, 0];

try{
    myColor = myDocument.colors.item("myAbsentColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myAbsentColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myAbsentColorSample});
    }
try{
    myColor = myDocument.colors.item("myProblemColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myProblemColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myProblemColorSample});
    }

var mySampleForSearchWord = "((?i)[аеиоуыюя]+[\\l\\u]*|[\\l\\u]*[аеиоуыюя][\\l\\u]*){2,}";/*Выбираем слова только из двух и более слогов*/
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;             
myFoundedWords = mySelection.findGrep();

if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение сверху вниз.
    for (j=0; j <= myFoundedWords.length-1; j++) { //  j >= 0
      if (myFoundedWords[j].appliedParagraphStyle.name !== "Paragraph Style Name") {
        myLine = myFoundedWords[j];
     
                var myWord = myAccent[myLine.contents.toLowerCase()]; // найденное слово  передается в ассоциативный массив
                                                         
              if (myWord == undefined) {// такого слова в ассоциативном масиве нет
                myLine.fillColor = "myAbsentColor";
                continue;
                }            
        if (myWord[0] == "*") { // возможны варианты написания этого слова
            myLine.fillColor = "myProblemColor";
            continue;
            }
     // проверка на заглавные буквы
        if (myLine.contents[0] == myLine.contents[0].toUpperCase() ) {
        if (myWord[0] == "="){continue;}  // если слово начинается с заглавной ударной гласной, его не меняем
          myWord = myWord[0].toUpperCase() +myWord.slice(1); // если с заглавной не ударной - меняем, но переводим в замене первую букву в верхний регистр     
            }
             
        // замена слова
        myLine.contents = myWord;    
        } // !== "Paragraph Style Name"
        } // j >= 0
} // != 0
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\=(.)";
app.changeGrepPreferences.appliedFont = "New\tPlain";// New\tPlain - это шрифт, в котором все гласные с ударением
app.changeGrepPreferences.changeTo = "$1";
app.activeDocument.changeGrep();
}
else {
    alert ("Нет открытых документов");
    }

exit();
 
В абзацных стилях есть достаточно много разных свойств, по которым можно рассортировать текст на две группы — "нужную" и "ненужную". Эти свойства можно указать в параметрах поиска вместо абзацного стиля. Это может быть язык, интерлиньяж, отбивки, ширина символов, да что угодно.
Но если среди всего этого богатства свойств не получится найти подходящие, можно, в конце концов, создать "пустой" символьный стиль и сделать его вложенным "до 1 символа конца вложенного стиля" в тех стилях, которые нужно найти, и в параметрах поиска задать поиск этого символьного стиля.
Если вложенные стили уже используются и метод не подойдёт, то можно создать копию используемого цвета, присвоить нужным абз.стилям и искать текст по цвету.
И т.д.
 
В абзацных стилях есть достаточно много разных свойств, по которым можно рассортировать текст на две группы — "нужную" и "ненужную". Эти свойства можно указать в параметрах поиска вместо абзацного стиля. Это может быть язык, интерлиньяж, отбивки, ширина символов, да что угодно.
Но если среди всего этого богатства свойств не получится найти подходящие, можно, в конце концов, создать "пустой" символьный стиль и сделать его вложенным "до 1 символа конца вложенного стиля" в тех стилях, которые нужно найти, и в параметрах поиска задать поиск этого символьного стиля.
Если вложенные стили уже используются и метод не подойдёт, то можно создать копию используемого цвета, присвоить нужным абз.стилям и искать текст по цвету.
И т.д.
Как всегда, сверх всяких ожиданий! 'cooll)'
 
там выше ошибся, проверку конечно же внутрь цикла нужно поставить
Код:
#include AccentsTest.jsx /*Это словарь, типа:
var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
return(accent);
})();
*/
if(app.documents.length != 0) {
var myDocument = app.documents[0];
var mySelection = app.selection[0];

myProblemColorSample = [0, 100, 100, 0];
myAbsentColorSample = [100, 0, 100, 0];

try{
    myColor = myDocument.colors.item("myAbsentColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myAbsentColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myAbsentColorSample});
    }
try{
    myColor = myDocument.colors.item("myProblemColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myProblemColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myProblemColorSample});
    }

var mySampleForSearchWord = "((?i)[аеиоуыюя]+[\\l\\u]*|[\\l\\u]*[аеиоуыюя][\\l\\u]*){2,}";/*Выбираем слова только из двух и более слогов*/
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;            
myFoundedWords = mySelection.findGrep();

if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение сверху вниз.
    for (j=0; j <= myFoundedWords.length-1; j++) { //  j >= 0
      if (myFoundedWords[j].appliedParagraphStyle.name !== "Paragraph Style Name") {
        myLine = myFoundedWords[j];
    
                var myWord = myAccent[myLine.contents.toLowerCase()]; // найденное слово  передается в ассоциативный массив
                                                        
              if (myWord == undefined) {// такого слова в ассоциативном масиве нет
                myLine.fillColor = "myAbsentColor";
                continue;
                }           
        if (myWord[0] == "*") { // возможны варианты написания этого слова
            myLine.fillColor = "myProblemColor";
            continue;
            }
     // проверка на заглавные буквы
        if (myLine.contents[0] == myLine.contents[0].toUpperCase() ) {
        if (myWord[0] == "="){continue;}  // если слово начинается с заглавной ударной гласной, его не меняем
          myWord = myWord[0].toUpperCase() +myWord.slice(1); // если с заглавной не ударной - меняем, но переводим в замене первую букву в верхний регистр    
            }
            
        // замена слова
        myLine.contents = myWord;   
        } // !== "Paragraph Style Name"
        } // j >= 0
} // != 0
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\=(.)";
app.changeGrepPreferences.appliedFont = "New\tPlain";// New\tPlain - это шрифт, в котором все гласные с ударением
app.changeGrepPreferences.changeTo = "$1";
app.activeDocument.changeGrep();
}
else {
    alert ("Нет открытых документов");
    }

exit();
Почему-то в таком варианте ставит ударения только в первом встретившемся абзаце нужного стиля, а в следующих - нет ( я делаю проверку не по !== , а по == "...")
 
там выше ошибся, проверку конечно же внутрь цикла нужно поставить
Код:
#include AccentsTest.jsx /*Это словарь, типа:
var myAccent = (function()
{
var accent={};
accent['аарон']='аар=он';
return(accent);
})();
*/
if(app.documents.length != 0) {
var myDocument = app.documents[0];
var mySelection = app.selection[0];

myProblemColorSample = [0, 100, 100, 0];
myAbsentColorSample = [100, 0, 100, 0];

try{
    myColor = myDocument.colors.item("myAbsentColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myAbsentColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myAbsentColorSample});
    }
try{
    myColor = myDocument.colors.item("myProblemColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDocument.colors.add ({name:"myProblemColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myProblemColorSample});
    }

var mySampleForSearchWord = "((?i)[аеиоуыюя]+[\\l\\u]*|[\\l\\u]*[аеиоуыюя][\\l\\u]*){2,}";/*Выбираем слова только из двух и более слогов*/
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = mySampleForSearchWord;            
myFoundedWords = mySelection.findGrep();

if (myFoundedWords.length != 0) { // != 0
// цикл по числу элементов коллекции. Движение сверху вниз.
    for (j=0; j <= myFoundedWords.length-1; j++) { //  j >= 0
      if (myFoundedWords[j].appliedParagraphStyle.name !== "Paragraph Style Name") {
        myLine = myFoundedWords[j];
    
                var myWord = myAccent[myLine.contents.toLowerCase()]; // найденное слово  передается в ассоциативный массив
                                                        
              if (myWord == undefined) {// такого слова в ассоциативном масиве нет
                myLine.fillColor = "myAbsentColor";
                continue;
                }           
        if (myWord[0] == "*") { // возможны варианты написания этого слова
            myLine.fillColor = "myProblemColor";
            continue;
            }
     // проверка на заглавные буквы
        if (myLine.contents[0] == myLine.contents[0].toUpperCase() ) {
        if (myWord[0] == "="){continue;}  // если слово начинается с заглавной ударной гласной, его не меняем
          myWord = myWord[0].toUpperCase() +myWord.slice(1); // если с заглавной не ударной - меняем, но переводим в замене первую букву в верхний регистр    
            }
            
        // замена слова
        myLine.contents = myWord;   
        } // !== "Paragraph Style Name"
        } // j >= 0
} // != 0
app.changeGrepPreferences = app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\=(.)";
app.changeGrepPreferences.appliedFont = "New\tPlain";// New\tPlain - это шрифт, в котором все гласные с ударением
app.changeGrepPreferences.changeTo = "$1";
app.activeDocument.changeGrep();
}
else {
    alert ("Нет открытых документов");
    }

exit();
Если делать проверку по !== , то работает, но только когда в публикации только один стиль, который нужно исключить, а если их несколько? То тогда придется делать отдельную проверку для каждого? А ударения нужно проставить только в одном стиле - "Основной текст". Как быть?
 
if ((myFoundedWords[j].appliedParagraphStyle.name !== "Paragraph Style Name1") || (myFoundedWords[j].appliedParagraphStyle.name !== "Paragraph Style Name2"))
 
@Сергий Задонский, пробуйте, мне сложно отлаживать без текста, да и некогда, честно сказать
Хорошо. Да, проверил более тщательно с исключающей проверкой, та же история - если подряд идут два абзаца, которые следует исключить, то исключается только первый, а во втором ударения уже ставятся :(
 
В абзацных стилях есть достаточно много разных свойств, по которым можно рассортировать текст на две группы — "нужную" и "ненужную". Эти свойства можно указать в параметрах поиска вместо абзацного стиля.
Евгений, в Вашем ответе как всегда море ценной информации, которая пополняет мой багаж. В моем случае проверка вроде бы работает по свойству "name", но как-то странно. Условие совпадения с нужным стилем :
Код:
if (myFoundedWords[j].appliedParagraphStyle.name == "Текст") {...}
срабатывает только в первом встретившемся абзаце стиля "Текст", а во втором и последующих уже нет :( Как такое возможно?
 
Сергей, вы уверены, что у вас стили нужные присвоены для остальных "ненужных" параграфов?
 
Сергей, вы уверены, что у вас стили нужные присвоены для остальных "ненужных" параграфов?
Может быть я что-то не понял в вопросе? У меня есть текст, большинству текстовых абзацев которого присвоен стиль "Текст", заголовкам - стиль "Заголовок" и нескольким абзацам - другие стили. Мне нужно, чтобы скрипт работал только в абзацах "Текст". И если я ставлю проверку в том виде, как в вышеприведенном коде (вне зависимости, исключающая она - !== "Заголовок" , или утверждающая - == "Текст"), работает только в первом встретившемся абзаце, удовлетворяющем условию проверки.
Если хотите, я могу предоставить тестовый текст, тестовый словарь и собственно, скрипт, который, впрочем уже приведен выше.
 
Последнее редактирование:
Мне нужно, чтобы скрипт работал только в абзацах "Текст".
Раз "только" — тогда вообще никаких проблем. Перед строкой
Код:
myFoundedWords = mySelection.findGrep();
поставьте ещё один параметр для поиска:
Код:
app.findGrepPreferences.appliedParagraphStyle = "Текст";
 
Раз "только" — тогда вообще никаких проблем. Перед строкой
Код:
myFoundedWords = mySelection.findGrep();
поставьте ещё один параметр для поиска:
Код:
app.findGrepPreferences.appliedParagraphStyle = "Текст";
Как всегда - нет слов! Просто и изящно!
 
Сергей, вы уверены, что у вас стили нужные присвоены для остальных "ненужных" параграфов?
Должен извиниться перед Вами. Действительно, проверка показала, что второй и последующий абзацы только выглядели, точно так же как первый, т.е. основные и дополнительные настройки у них совпадали, но стиль был присвоен только первому (та же история и с двумя подряд идущими заголовками). Вы были правы.
 
Статус
Закрыто для дальнейших ответов.