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

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Делаю перенумератор псевдосносок (пронумерованные абзацы с неавтономером в верхнем индексе) в отдельном фрейме. Авторы могут добавить(удалить) сноску где угодно. Придется остальные перенумеровать. Вот нужно узнать номер абзаца, на котором стоит курсор. Запутался с индексами:
Код:
index0 = mStory.insertionPoints[0].paragraphs.index();
ESTK говорит, что это не функция.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Правильно говорит. У коллекции нет метода index
 

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Правильно говорит. У коллекции нет метода index
Да, но узнать порядковый номер объекта в коллекции как-то же можно? Без перебора всех элементов до совпадения части строки. Уж так не хочется...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Но это не значит что у paragraph его нет
Попробуйте
JavaScript:
index0 = mStory.insertionPoints[0].paragraphs[0].index;
 

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Но это не значит что у paragraph его нет
Попробуйте
JavaScript:
index0 = mStory.insertionPoints[0].paragraphs[0].index;
Пишет, что index0 = 0. Видимо, оно смотрит само на себя, видит, что это paragraphs[0], и говорит, что и это, действительно первый параграф.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Странно, у меня вроде работало
Вот к примеру, нашел у себя кусок кода определяющий номер выделенной строки:
JavaScript:
function getLine(ln)
{
    var pt=ln.parent;
    for (var i=0;i<pt.lines.length;i++)
    {
        if (pt.lines[i].index==ln.index) return i;
    }
}
 

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Странно, у меня вроде работало
Вот к примеру, нашел у себя кусок кода определяющий номер выделенной строки:
JavaScript:
function getLine(ln)
{
    var pt=ln.parent;
    for (var i=0;i<pt.lines.length;i++)
    {
        if (pt.lines[i].index==ln.index) return i;
    }
}
Код:
  var mStory = app.selection[0].parentStory;
  var mPara = mStory.insertionPoints[0].paragraphs[0];
    for (var i=0;i<mStory.paragraphs.length;i++)
    {
        if (mStory.paragraphs[i].index==mPara.index) {}; //return i;
    }
mPara.index всегда равен нулю. У меня, похоже, не в том месте измеряется индекс абзаца. Где-то с этим уже сталкивался, но не могу вспомнить сейчас.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
mPara.index всегда равен нулю. У меня, похоже, не в том месте измеряется индекс абзаца. Где-то с этим уже сталкивался, но не могу вспомнить сейчас.
Вы почитайте Гадскую ссылку
Там популярно объясняется почему с параграфами этот трюк не работает и как с этим бороться
Как вариант - сделать цикл по линиям и смотреть принадлежность их к тому или иному параграфу
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
он и должен быть равен нулю, потому что это mStory.insertionPoints[0].paragraphs[0] указывает на нулевой параграф
Это вовсе не очевидно - mStory.insertionPoints[0].lines[0] например вовсе не на нулевую линию указывает
Индусская логика в этом смысле такая индусская
 

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
он и должен быть равен нулю, потому что это mStory.insertionPoints[0].paragraphs[0] указывает на нулевой параграф
Да, надо было для начала писать так: app.selection[0].paragraphs[0]. Тогда скрипт увидит абзац именно под курсором.
В результате получилось незатейливо:
Код:
   var mStory = app.selection[0].parentStory;
    var mPara = app.selection[0].paragraphs[0];
    mIndex="";
    for (var i=0;i<mStory.paragraphs.length;i++)
    {if (mStory.paragraphs[i].contents==mPara.contents){mIndex= i; break};}
alert(mIndex)
Сравнение по содержимому.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
На самом деле сильно нехороший костыль ибо содержимое может совпадать
Я б все ж советовал по index первой линии проверять
 
  • Спасибо
Реакции: hulk1776

Gad

Сообщения
2 975
Реакции
1 408
Ну и все таки :)
Код:
var mySelection = app.selection[0];
var currentParagraphlndex = mySelection.parentStory.contents.substring(0, mySelection.index).split('\r').length - 1;
alert (currentParagraphlndex)
 
  • Спасибо
Реакции: afalbert и _MBK_

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Пожалуй, так даже проще ибо линейно
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Код:
function collectIndexes (story) {
    var result = {};
    var paragraphs = story.paragraphs.everyItem().getElements();
    for (var p = 0; p < paragraphs.length; p++) {
        var index = paragraphs[p].characters[0].getElements()[0].index;
        result[index] = p + 1;
    }
    return result;
}

var para = app.selection[0].paragraphs[0];
var indexes = collectIndexes(para.parentStory);
var number = indexes[para.characters[0].getElements()[0].index];
$.writeln(number);

Или

JavaScript:
var ip = app.selection[0].insertionPoints[0];
var story = app.selection[0].parentStory;
var text = story.insertionPoints.itemByRange(story.insertionPoints[0], ip).getElements()[0];
var number = text.contents.toString().split('\u000D').length;
$.writeln(number);