Получите точный индекс символа в документах Google независимо от количества отображаемых страниц - PullRequest
1 голос
/ 04 августа 2020

Обзор проблемы:

Найти точный индекс позиции курсора пользователя в большом Google do c.

Сведения о проблеме:

Google do c - это в основном веб-страница. Изготовлен из html, css и javascript. Когда вы щелкаете внутри Google do c, курсор сразу переходит в позицию щелчка.

В Google do c, скажем, только 1 страница, можно получить точный индекс пользователя положение каретки. Все, что нужно сделать, это пройти по элементам DOM, получить весь текст в строку и узнать индекс каретки внутри этой строки.

Но в случае более крупных документов Google (скажем, с 20 страниц), не весь текст загружается в do c при загрузке документа. Только первая страница полностью отображается в DOM, а остальная часть содержимого отображается постепенно, по мере того, как пользователь прокручивает до c.

Если вы быстро прокручиваете, чтобы сказать 10-ю страницу, содержимое 10-й страницы полностью отрисован. Но текст на предыдущих страницах не отображается. По этой причине получение правильного индекса курсора на 10-й странице невозможно. Если вы извлечете весь текст из do c путем обхода DOM и попытаетесь найти индекс, он всегда будет неправильным (поскольку много текста до каретки в do c никогда не отображалось).

Из наших исследований и разработок мы знаем, что google do c действительно где-то хранит индекс каждого символа в do c. Мы знаем это, потому что если вы введете символ на 10-й странице, вызов API будет выполнен немедленно, и этот вызов API будет иметь в нем правильный индекс символа. Вы можете увидеть этот вызов API на вкладке chrome браузера * сети.

URL-адрес API выглядит следующим образом: https://docs.google.com/document/d/1rt2aOa9_nAWGAQQGZWWzEPxnVihWpC0Ejv1ghh69KM9o4/save?id=1rt2aOa9_nAWGAQQGZWWzEPxnVihWpC0Ejv1x_aWKM9o&sid=7bb6f7c06b7ab1ef&vc=1&c=1&w=1&flr=0&smv=8&token=AC4w5VhH-UTBlVwVdFQIbjS77y8mchf4Zw%3A1596552882670&includes_info_params=true

Как видно из вставленного выше URL-адреса, URL-адрес API заканчивается словом «сохранить». Это POST api, и индекс можно увидеть в опубликованном теле JSON. Ключ JSON, содержащий индекс, называется «si». Мы не знаем, где он хранится и как к нему добраться.

Требуется решение:

Требуется фрагмент кода Javascript, который можно вставить в консоль chrome инструментов разработчика. По сути, я быстро прокручиваю до 10-й страницы, например, 20-страничной команды c, щелкаю где-нибудь на этой странице, а затем вставляю фрагмент кода в консоль, и это должно дать нам правильный индекс символа каретки. Конечно, do c не следует полностью отрисовывать, медленно прокручивая страницы вручную.

Дополнительные сведения: Chrome - единственный браузер, для которого нам нужно решение . Другие браузеры можно игнорировать. Причина, по которой мы просим фрагмент кода, который можно вставить в консоль инструментов разработчика chrome, заключается в том, что мы создаем расширение chrome, и любой код, выполняемый в консоли, можно использовать внутри нашего расширения chrome. легко.

Ссылки: См. файл googleDocsUtil. js по адресу: https://github.com/JensPLarsen/ChromeExtension-GoogleDocsUtil/tree/master/sample-extension. В этом файле есть код для получения индекса из Google do c. Это неплохо, но не работает в больших документах, где все страницы до выбранного символа не были отрисованы. Обратитесь к этой замечательной статье о реверс-инжиниринге Google do c: https://features.jsomers.net/how-i-reverse-engineered-google-docs/

...