[ID CC-CC2021] Как заменить табуляции на последовательность пробелов без изменения внешнего вида текста?

rezunoff

Участник
Топикстартер
Сообщения
69
Реакции
13
1599305535170.png
 

Вложения

  • 1599305390185.png
    1599305390185.png
    51.3 КБ · Просм.: 151

Gad

Сообщения
2 971
Реакции
1 405
Поиском-заменой думаю... но все, зависит от настроек табуляции, возможно придется скриптом.
Но зачем? Можете рассказать более подробно, возможно будет более простое/правильно решение :) Ибо отступы пробелами ИМХО зло.
 

rezunoff

Участник
Топикстартер
Сообщения
69
Реакции
13
Поиском-заменой думаю... но все, зависит от настроек табуляции, возможно придется скриптом.
Но зачем? Можете рассказать более подробно, возможно будет более простое/правильно решение :) Ибо отступы пробелами ИМХО зло.
Дело касается стихотворных строк. Да, настройки табуляции могут быть разные. При выравнивании строк по центру фрейма (отступ слева), позиция табуляции сохраняется - в результате чего нарушается изначальное позиционирование строк.
 

iv-mi

15 лет на форуме
Сообщения
563
Реакции
375
Можно сперва запомнить Х-координату начала строки, перед которой знаки табуляции, а потом убрать их и в цикле добавлять пробелы, пока не будет достигуто или перейдено запомненнное значение.
 

rezunoff

Участник
Топикстартер
Сообщения
69
Реакции
13
Можно сперва запомнить Х-координату начала строки, перед которой знаки табуляции, а потом убрать их и в цикле добавлять пробелы, пока не будет достигуто или перейдено запомненнное значение.
Да, все верно Михаил (~myLine.characters.firstItem().horizontalOffset~). У Вас это реализовано в скрипте ~Вёрстка стихов~. Не могу сделать цикл добавления пробелов до Х-координаты.
 

Gad

Сообщения
2 971
Реакции
1 405
Не особо понимаю в особенностях верстки стихов :)
А вот так не пойдет?
Код:
function main(){
        if (app.activeDocument.selection.length > 0) {
            var sel = app.activeDocument.selection[0];
            if (app.activeDocument.selection[0].constructor.name == "TextFrame"){
            var Frame  = sel;
            }    else    {
                    if (app.activeDocument.selection[0].constructor.name == "Character"){
                    var Frame  = app.activeDocument.selection[0].textFrames[0];
                    }    else    {
                        var Frame  = sel.parentTextFrames[0];
                        };
                };

var tLines = Frame.lines;
app.findGrepPreferences = NothingEnum.NOTHING;
app.changeGrepPreferences = NothingEnum.NOTHING;
app.findGrepPreferences.findWhat = "\t";
app.changeGrepPreferences.changeTo = "";

    for (j=0;j<tLines.length;j++){
        var xEnd = tLines[j].insertionPoints[-2].horizontalOffset
        Frame.lines[j].changeGrep();
        Frame.lines[j].paragraphs[0].leftIndent = xEnd - tLines[j].insertionPoints[-2].horizontalOffset
    }
        }    else    {
            alert ("Нет выделенного текста")
            };
}; //main

app.doScript (main, undefined,undefined, UndoModes.ENTIRE_SCRIPT);
Обрабатывает весь активный фрейм.
 
  • Спасибо
Реакции: Валера1966

rezunoff

Участник
Топикстартер
Сообщения
69
Реакции
13
Не особо понимаю в особенностях верстки стихов :)
А вот так не пойдет?
Код:
function main(){
        if (app.activeDocument.selection.length > 0) {
            var sel = app.activeDocument.selection[0];
            if (app.activeDocument.selection[0].constructor.name == "TextFrame"){
            var Frame  = sel;
            }    else    {
                    if (app.activeDocument.selection[0].constructor.name == "Character"){
                    var Frame  = app.activeDocument.selection[0].textFrames[0];
                    }    else    {
                        var Frame  = sel.parentTextFrames[0];
                        };
                };

var tLines = Frame.lines;
app.findGrepPreferences = NothingEnum.NOTHING;
app.changeGrepPreferences = NothingEnum.NOTHING;
app.findGrepPreferences.findWhat = "\t";
app.changeGrepPreferences.changeTo = "";

    for (j=0;j<tLines.length;j++){
        var xEnd = tLines[j].insertionPoints[-2].horizontalOffset
        Frame.lines[j].changeGrep();
        Frame.lines[j].paragraphs[0].leftIndent = xEnd - tLines[j].insertionPoints[-2].horizontalOffset
    }
        }    else    {
            alert ("Нет выделенного текста")
            };
}; //main

app.doScript (main, undefined,undefined, UndoModes.ENTIRE_SCRIPT);
Обрабатывает весь активный фрейм.
Спасибо, хорошее решение. Результат получили - заменой \t на .leftIndent. Вместо отступа слева нужна очередность пробелов.
 

Gad

Сообщения
2 971
Реакции
1 405
Вместо отступа слева нужна очередность пробелов.
Мне казалось это решает Вашу проблему с выравниванием... :) видимо нет
Держите.
Код:
function main(){
        if (app.activeDocument.selection.length > 0) {
            var sel = app.activeDocument.selection[0];
            if (app.activeDocument.selection[0].constructor.name == "TextFrame"){
            var Frame  = sel;
            }    else    {
                    if (app.activeDocument.selection[0].constructor.name == "Character"){
                    var Frame  = app.activeDocument.selection[0].textFrames[0];
                    }    else    {
                        var Frame  = sel.parentTextFrames[0];
                        };
                };

    var tLines = Frame.lines;
    app.findGrepPreferences = NothingEnum.NOTHING;
    app.changeGrepPreferences = NothingEnum.NOTHING;

    for (j=0;j<tLines.length;j++){
        var xEnd = tLines[j].insertionPoints[-2].horizontalOffset
        setChangeGrep ("\t", "");
        Frame.lines[j].changeGrep();
            while (tLines[j].insertionPoints[-2].horizontalOffset<xEnd) {
            textLine = " " + Frame.lines[j].contents
            setChangeGrep (Frame.lines[j].contents, textLine);
            Frame.lines[j].changeGrep();
            }
    }
        }    else    {
            alert ("Нет выделенного текста")
            };
}; //main
app.doScript (main, undefined,undefined, UndoModes.ENTIRE_SCRIPT);

function setChangeGrep(find, change) {
    app.findGrepPreferences.findWhat = find;
    app.changeGrepPreferences.changeTo = change;
   
};
 
Последнее редактирование:
  • Спасибо
Реакции: rezunoff

Gad

Сообщения
2 971
Реакции
1 405
Обратите внимание, что для простоты беру координату последнего символа строки, то есть перед применением скрипта ширина фрейма должна быть достаточна, чтобы все абзацы были в одну строку, без переносов! Иначе скрипт будет ошибаться.
 

rezunoff

Участник
Топикстартер
Сообщения
69
Реакции
13
Мне казалось это решает Вашу проблему с выравниванием... :) видимо нет
Держите.
Код:
function main(){
        if (app.activeDocument.selection.length > 0) {
            var sel = app.activeDocument.selection[0];
            if (app.activeDocument.selection[0].constructor.name == "TextFrame"){
            var Frame  = sel;
            }    else    {
                    if (app.activeDocument.selection[0].constructor.name == "Character"){
                    var Frame  = app.activeDocument.selection[0].textFrames[0];
                    }    else    {
                        var Frame  = sel.parentTextFrames[0];
                        };
                };

    var tLines = Frame.lines;
    app.findGrepPreferences = NothingEnum.NOTHING;
    app.changeGrepPreferences = NothingEnum.NOTHING;

    for (j=0;j<tLines.length;j++){
        var xEnd = tLines[j].insertionPoints[-2].horizontalOffset
        setChangeGrep ("\t", "");
        Frame.lines[j].changeGrep();
            while (tLines[j].insertionPoints[-2].horizontalOffset<xEnd) {
            textLine = " " + Frame.lines[j].contents
            setChangeGrep (Frame.lines[j].contents, textLine);
            Frame.lines[j].changeGrep();
            }
    }
        }    else    {
            alert ("Нет выделенного текста")
            };
}; //main
app.doScript (main, undefined,undefined, UndoModes.ENTIRE_SCRIPT);

function setChangeGrep(find, change) {
    app.findGrepPreferences.findWhat = find;
    app.changeGrepPreferences.changeTo = change;
  
};
Большое спасибо. То что надо.