&TC.Hollingsworth; &TC.Hollingsworth.mail;
Юрій
Чорноіван

    yurchor@ukr.net

Переклад українською

# Розширення можливостей &kate;

## Вступ

Подібно до всіх текстових редакторів з широкими можливостями, у &kate; передбачено певні шляхи до розширення функціональних можливостей програми. Ви можете створювати прості скрипти, що реалізують додаткові можливості, за допомогою JavaScript, розширювати можливості компонента редактора за допомогою додатків компонента редактора або розширювати можливості самого редактора за допомогою додатків до програми &kate;, написаних мовою C++ чи додатків &pate;, написаних мовою Python. Нарешті, вдосконаливши ваш екземпляр &kate;, ви можете долучитися до розробників і поділитися вашими удосконаленнями з іншими користувачами!

## Створення скриптів мовою JavaScript

Починаючи з версії &kappname; 3.4 у KDE 4.4, можливості компонента редактора &kappname; можна дуже просто розширити за допомогою написання скриптів. Для написання скриптів слід використовувати мову ECMAScript (широко відому як JavaScript). У &kappname; передбачено підтримку двох типів скриптів: скрипти встановлення відступів та скрипти командного рядка.

### Скрипти додавання відступів

Скрипти встановлення відступів, які також будемо називати інструментами відступів, автоматично встановлюють відступи у тексті під час його введення. Наприклад, після натискання клавіші &Enter; програма зазвичай збільшує відступ у наступному рядку.

У наступних розділах наведено покрокові настанови щодо створення основи простого інструменту відступів. На першому кроці вам слід створити файл `*.js` з назвою, наприклад, `javascript.js` у локальній домашній теці `$KDEHOME/share/apps/katepart/indentation`.

#### Заголовок скрипту додавання відступів

Заголовок файла `javascript.js` подається у межах закоментованого блоку і має таку форму

    /* kate-script
     * name: JavaScript
     * author: Example Name <example.name@some.address.org>
     * license: BSD
     * revision: 1
     * kate-version: 3.4
     * required-syntax-style: javascript
     * indent-languages: javascript
     * priority: 0
     * i18n-catalog: mycatalog
     *
     * A line without colon ':' stops header parsing. That is, you can add optional
     * text here such as a detailed license.
     */

Нижче ми зупинимося докладніше на кожному з записів заголовка.

- `kate-script` [обов’язковий запис]: цей текст слід додавати у першому рядку файла `*.js`, інакше &kappname; просто відмовиться обробляти скрипт.

- `name` [обов’язковий запис]: це назва інструменту відступів, яку буде показано у меню Інструменти Відступ і діалогових вікнах налаштування.

- `author` [необов’язковий запис]: ім’я автора та дані щодо способу встановлення з ним зв’язку.

- `license` [необов’язковий запис]: скорочена форма умов ліцензування, зокрема BSD або LGPLv3.

- `revision` [обов’язковий запис]: версія скрипту. Внесення змін до коду скрипту має призводити до збільшення його версії.

- `kate-version` [обов’язковий запис]: мінімальне значення версії &kappname;, у якій працюватиме скрипт.

- `required-syntax-style` [необов’язковий запис]: відокремлений комами список потрібних для роботи скрипту стилів підсвічування синтаксичних конструкцій. Цей запис є важливим для інструментів відступів, які працюють на основі певних даних щодо підсвічування у документі. Якщо буде вказано стиль синтаксичних конструкцій, інструментом відступів можна буде скористатися, лише якщо буде задіяно відповідний інструмент підсвічування тексту. Таким чином можна запобігти «невизначеній поведінці», спричиненій використанням інструменту відступів без потрібної для його роботи схеми підсвічування. Наприклад, у такий спосіб налаштовано інструмент відступів Ruby у файлах `ruby.js` і `ruby.xml`.

- `indent-languages` [необов’язковий запис]: відокремлений комами список стилів синтаксичних конструкцій, які може обробляти інструмент відступів, наприклад c++, java.

- `priority` [необов’язковий запис]: якщо якомусь файлу з визначеним підсвічуванням синтаксичних конструкцій відповідає декілька інструментів відступів, за допомогою цього запису буде встановлено пріоритет застосування інструменту відступів.

- `i18n-catalog` [необов’язковий]: додатковий каталог повідомлень (файл `po`), завантажений для перекладу сторонніх інструментів відступів.

&kappname; виконує читання всіх пар записів у формі ключ:значення, аж доки не буде вичерпано перелік рядків з двокрапками. Це означає, що у заголовку може міститися довільний текст, зокрема текст ліцензії, як це показано у нашому прикладі.

#### Код інструменту відступів

Тепер, озброєні знаннями про формат заголовка, ви можете перейти до вивчення того, як же працює сам скрипт встановлення відступів. Основа подібного скрипту виглядає так:

    // вимагаємо бібліотек JS katepart, наприклад range.js, якщо використовується Range
    require ("range.js");

    triggerCharacters = "{}/:;";
    function indent(line, indentWidth, ch)
    {
        //скрипт буде викликано під час обробки символу нового рядка (ch == '\n') і всіх символів, вказаних у
        // загальній змінній triggerCharacters. Під час використання пункту меню ІнструментиВирівняти
        // змінна ch матиме порожнє значення, тобто ch == ''.
        //
        // див. також розділ «Інтерфейс (API) роботи зі скриптами»
        return -2;
    }

У функції `indent()` передбачено три параметри:

- `line`: рядок, у якому слід встановити відступ

- `indentWidth`: ширина відступу у пробілах

- `ch`: символ нового рядка (`ch == '\n'`), символ перемикання, вказаний за допомогою `triggerCharacters` або порожній рядок, якщо користувачем було обрано пункт меню Інструменти Вирівняти.

Значення, повернуте функцією `indent()`, визначатиме спосіб встановлення відступу у рядку. Якщо буде повернуто ціле число, його обробку буде виконано за такими варіантами:

- повернуто значення `-2`: нічого не робити

- повернуто значення `-1`: зберегти відступ (його буде визначено на основі попереднього непорожнього рядка)

- повернуто значення `0`: числа >= 0 визначають глибину відступу у пробілах

Крім того, може бути повернуто масив з двох елементів:

- `повернуто [ відступ, вирівнювання ];`

Першим елементом такого масиву є глибина відступу, подібна на значення, про яке ми говорили раніше. Інший же елемент є абсолютним значенням, що відповідає стовпчику «вирівнювання». Якщо це значення буде більшим за значення відступу, до відступу після додавання відступу, визначеного першим параметром, буде додано різницю між цими значенням. Якщо ж значення другого параметра буде меншим за відступ, його буде проігноровано. Одночасне використання для встановлення відступів пробілів і символів табуляції часто називають «мішаним режимом».

Розглянемо такий приклад: для встановлення відступів використовується символ табуляції, а ширину відступу визначено як 4 пробіли. У нашому прикладі, <таб> — це символ табуляції, а «.» — пробіл:

    1: <таб><таб>foobar("привіт",
    2: <таб><таб>......."світе");

Під час встановлення відступу для рядка 2 функція `indent()` повертає значення [8, 15]. У результаті буде додано два символи табуляції для встановлення відступу до стовпчика 8, а потім буде додано 7 пробілів для вирівнювання за другим параметром, більшим за перший, отже рядок залишатиметься вирівняним під час перегляду файла за будь-якої встановленої ширити відступу табуляції.

У типовому пакунку KDE для &kappname; передбачено декілька інструментів відступів. Код цих інструментів мовою JavaScript зберігається у каталозі `$KDEDIR/share/apps/katepart/script/indentation`.

Під час розробки скрипту встановлення відступів корисним буває перезавантаження скриптів для перевірки коректності поведінки під час встановлення відступів. Замість перезапуску програми достатньо просто перейти до командного рядка і виконати команду `reload-scripts`.

Якщо вами було створено якийсь корисний скрипт, ви зробити його вашим власним внеском до проекту розробки &kappname;. Будь ласка, повідомте про вашу розробку у списку листування програми.

### Скрипти командного рядка

Оскільки всі користувачі мають різні потреби, у &kappname; передбачено підтримку невеличких допоміжних інструментів для пришвидшення роботи з фрагментами тексту за допомогою вбудованого командного рядка. Наприклад, команду `sort` (впорядкувати) реалізовано саме за допомогою такого інструменту або скрипту. У цьому розділі ви знайдете пояснення щодо способу створення файлів `*.js`, які допоможуть вам розширити можливості &kappname; додаванням допоміжних скриптів.

Скрипти командного рядка зберігаються у одній теці зі скриптами встановлення відступів. Отже на першому кроці вам слід створити файл `*.js` з назвою `myutils.js` у локальній домашній теці `$KDEHOME/share/apps/katepart/script/commands`.

#### Заголовок скрипту командного рядка

Заголовок файла `javascript.js` подається у межах закоментованого блоку і має таку форму

    /* kate-script
     * author: Example Name <example.name@some.address.org>
     * license: BSD
     * revision: 1
     * kate-version: 3.4
     * functions: sort, format-paragraph
     * i18n-catalog: mycatalog
     *
     * A line without a colon ':' stops header parsing. That is, you can add optional
     * text here such as a detailed license.
     */

Нижче наведено докладніший опис кожного з записів заголовка.

- `kate-script` [обов’язковий запис]: цей текст слід додавати у першому рядку файла `*.js`, інакше &kappname; просто відмовиться обробляти скрипт.

- `author` [необов’язковий запис]: ім’я автора та дані щодо способу встановлення з ним зв’язку.

- `license` [необов’язковий запис]: скорочена форма умов ліцензування, зокрема BSD або LGPLv3.

- `revision` [обов’язковий запис]: версія скрипту. Внесення змін до коду скрипту має призводити до збільшення його версії.

- `kate-version` [обов’язковий запис]: мінімальне значення версії &kappname;, у якій працюватиме скрипт.

- `functions` [обов’язковий запис]: відокремлений комами список команд скрипту.

- `i18n-catalog` [необов’язковий]: додатковий каталог повідомлень (файл `po`), завантажений для перекладу сторонніх скриптів.

&kappname; виконує читання всіх пар записів у формі ключ:значення, аж доки не буде вичерпано перелік рядків з двокрапками. Це означає, що у заголовку може міститися довільний текст, зокрема текст ліцензії, як це показано у нашому прикладі. Значенням ключів функцій має бути відокремлений комами список параметрів командного рядка. Це означає, що у одному скрипті може міститися довільна кількість команд командного рядка. Доступ до функцій можна буде отримати за допомогою вбудованого командного рядка &kappname;.

#### Код скрипту командного рядка

Всі оголошені у заголовку функції має бути реалізовано у тілі скрипту. Наприклад, у файлі скрипту з наведеного вище прикладу слід реалізувати дві функції, `sort` і `format-paragraph`. Всі функції має бути записано відповідно до таких синтаксичних правил:

    // вимагаємо бібліотек JS katepart, наприклад range.js, якщо використовується Range
    require ("range.js");

    function <назва>(параметр1, параметр2, ...)
    {
        // ...реалізація, див. також: Інтерфейс (API) роботи зі скриптами
    }

Параметри у командному рядку передаються функції як `параметр1`, `параметр2` тощо. Щоб надати користувачам можливість ознайомлюватися з документацією щодо команди, просто реалізуйте функцію '`help`' у такий спосіб:

    function help(cmd)
    {
        if (cmd == "sort") {
            return i18n("Sort the selected text.");
        } else if (cmd == "...") {
            // ...
        }
    }

Після цього виконання команди `help sort` у командному рядку призведе до виклику відповідної функції довідки (help) з параметром `cmd` встановленим у назву вказаної команди, тобто, у нашому прикладі, `cmd == "sort"`. У відповідь на команду &kappname; покаже користувачеві визначений вами текст довідки.

##### Призначення клавіатурних скорочень

Призначення клавіатурних скорочень стане можливим, лише якщо у вашому скрипті є функція з назвою `action` у такому форматі:

    function action(cmd)
    {
        var a = new Object();
        if (cmd == "sort") {
            a.text = i18n("Sort Selected Text");
            a.icon = "";
            a.category = "";
            a.interactive = false;
            a.shortcut = "";
        } else if (cmd == "moveLinesDown") {
            // same for next action
        }
        return a;
    }

Параметр `cmd` цієї функції визначає команду, виконання якої буде пов’язано з клавіатурним скороченням. Для повернутого об’єкта javascript має бути визначено декілька значень полів:

- `a.text` [обов’язковий запис]: це текст пункту, який буде показано у меню Інструменти Скрипти. Не забудьте вказати `i18n` для перекладу.

- `a.icon` [необов’язковий запис]: піктограма, яку буде показано поряд з текстом пункту меню. Можна використовувати назву будь-якої з піктограм KDE.

- `a.category` [необов’язковий запис]: якщо буде вказано категорію, пункт скрипту буде додано у підменю. Не забудьте використати `i18n`, щоб уможливити переклад.

- `a.interactive` [необов’язковий]: якщо для роботи скрипту потрібні дані, введені користувачем, встановіть значення `true`.

- `a.shortcut` [необов’язковий запис]: клавіатурне скорочення, вказане за допомогою цього значення буде типовим. Приклад: Ctrl+Alt+t. Докладніше про можливі скорочення можна дізнатися з документації до Qt.

Під час розробки скрипту командного рядка корисним буває перезавантаження скриптів для перевірки коректності поведінки під час встановлення відступів. Замість перезапуску програми достатньо просто перейти до командного рядка і виконати команду `reload-scripts`.

Якщо вами було створено якийсь корисний скрипт, ви зробити його вашим власним внеском до проекту розробки &kappname;. Будь ласка, повідомте про вашу розробку у списку листування програми.

### Інтерфейс (API) роботи зі скриптами

Програмним інтерфейсом роботи зі скриптами, основи якого викладено тут, можна користуватися у будь-яких скриптах, зокрема скриптах роботи з відступами та командному рядку програми. Класи `Cursor` і `Range` визначаються бібліотечними файлами у `$KDEDIR/share/apps/katepart/libraries`. Якщо вам потрібно ними скористатися у певному скрипті для використання якихось із функцій `Document` або `View`, будь ласка, включіть до скрипту потрібну вам бібліотеку такою командою:

    // вимагаємо бібліотек JS katepart, наприклад range.js, якщо використовується Range
    require ("range.js");

Щоб розширити стандартний програмний інтерфейс (API) для роботи зі скриптами власними функціями і прототипами просто створіть файл у локальній теці файлів налаштування KDE, `$KDEHOME/share/apps/katepart/libraries`, і включіть його до вашого скрипту за допомогою такого коду:

    require ("vashscript.js");

Рекомендованим способом розширення можливостей прототипів, зокрема `Cursor` або `Range`, не є внесення змін до загальних файлів `*.js`. Для цього вам краще внести зміи до прототипу `Cursor` у JavaScript після команди включення `cursor.js` до вашого скрипту за допомогою `require`.

#### Курсори і діапазони

Оскільки &kappname; є текстовим редактором, весь програмний інтерфейс (API) за можливості засновано на курсорах та діапазонах тексту. Об’єкт Cursor (курсор) є простим кортежем `(line, column)` (рядок, стовпчик), що визначає позицію у тексті документа. Об’єкт Range (діапазон) це фрагмент тексту від початкової позиції курсора до кінцевої позиції курсора. Докладніше про програмний інтерфейс (API) ми поговоримо у наступних розділах.

##### Прототип Cursor (курсор)

    Cursor();

  Конструктор. Повертає об’єкт Cursor (курсор) у позиції `(0, 0)`.

  Приклад: `var cursor = new Cursor();`

    Cursor(int рядок, int стовпчик);

  Конструктор. Повертає об’єкт Cursor (курсор) у позиції (рядок, стовпчик).

  Приклад: `var cursor = new Cursor(3, 42);`

    Cursor(Cursor інший);

  Конструктор копіювання. Повертає копію курсора інший.

  Приклад: `var copy = new Cursor(other);`

    Cursor Cursor.clone();

  Повертає клон курсора.

  Приклад: `var clone = cursor.clone();`

    Cursor.setPosition(int рядок, int позиція);

  Встановлює курсор у місце вказане параметрами рядок і позиція.

  Актуальна версія: KDE 4.11

    bool Cursor.isValid();

  Перевіряє, чи є курсор коректним. Курсор вважається некоректним, якщо значення його позицій у рядку і/або стовпчику дорівнюють `-1`.

  Приклад: `var valid = cursor.isValid();`

    Cursor Cursor.invalid();

  Повертає новий некоректний курсор, розташований у позиції `(-1, -1)`.

  Приклад: `var invalidCursor = cursor.invalid();`

    int Cursor.compareTo(Cursor інший);

  Порівнює поточний курсор з курсором інший. Повертає

  - `-1`, якщо поточний курсор розташовано перед курсором інший,

  - `0`, якщо курсори у однакових позиціях і

  - `+1`, якщо поточний курсор розташовано після курсора інший.

    bool Cursor.equals(Cursor інший);

  Повертає `true`, якщо цей курсор і курсор інший є однаковими. Якщо це не так, повертає `false`.

    String Cursor.toString();

  Повертає об’єкт курсора як рядок у формі `Cursor(line, column)`.

##### Прототип Range (діапазон)

    Range();

  Конструктор. Виклик `new Range()` повертає Range (діапазон) у (0, 0) - (0, 0).

    Range(Cursor початок, Cursor кінець);

  Конструктор. Виклик функції `new Range(початок, кінець)` повертає Range (діапазон)(початок, кінець).

    Range(int початковийРядок, int початковийСтовпчик, int кінцевийРядок, int кінцевийСтовпчик);

  Конструктор. Виклик функції `new Range(початковийРядок, початковийСтовпчик, кінцевийРядок, кінцевийСтовпчик)` повертає Range (діапазон) від позиції (початковийРядок, початковийСтовпчик) до позиції (кінцевийРядок, кінцевийСтовпчик).

    Range(Range інший);

  Конструктор копіювання. Повертає копію Range інший.

    Range Range.clone();

  Повертає клон діапазону.

  Приклад: `var clone = range.clone();`

    bool Range.isEmpty();

  Повертає `true`, якщо початкова і кінцева позиції курсора є рівними.

  Приклад: `var empty = range.isEmpty();`

  Актуальна версія: KDE 4.11

    bool Range.isValid();

  Повертає `true`, якщо початкова і кінцева позиції курсора є коректними. Якщо це не так, повертає `false`.

  Приклад: `var valid = range.isValid();`

    Range Range.invalid();

  Повертає Range (діапазон) від (-1, -1) до (-1, -1).

    bool Range.contains(Cursor курсор);

  Повертає `true`, якщо позиція курсора міститься у діапазоні, у іншому випадку повертає `false`.

    bool Range.contains(Range інший);

  Повертає `true`, якщо поточний діапазон містить діапазон інший. Якщо це не так, повертає `false`.

    bool Range.containsColumn(int стовпчик);

  Повертає `true`, якщо стовпчик належить напіввідкритому інтервалу `[start.column, end.column)`. Якщо це не так, повертає `false`.

    bool Range.containsLine(int рядок);

  Повертає `true`, якщо рядок належить до напіввідкритого інтервалу `[start.line, end.line)`. Якщо це не так, повертає `false`.

    bool Range.overlaps(Range інший);

  Повертає `true`, якщо поточний діапазон і діапазон інший мають ненульовий перетин. Якщо це не так, повертає `false`.

    bool Range.overlapsLine(int рядок);

  Повертає `true`, якщо рядок належить до інтервалу `[start.line, end.line]`. Якщо це не так, повертає `false`.

    bool Range.overlapsColumn(int стовпчик);

  Повертає `true`, якщо стовпчик належить інтервалу `[start.column, end.column]`. Якщо це не так, повертає `false`.

    bool Range.onSingleLine();

  Повертає `true`, якщо діапазон починається і завершується на тому самому рядку, тобто якщо Range.start.line == Range.end.line.

  Актуальна версія: KDE 4.9

    bool Range.equals(Range інший);

  Повертає `true`, якщо поточний діапазон і діапазон інший тотожні. Якщо це не так, повертає `false`.

    String Range.toString();

  Повертає діапазон у форматі `Range(Cursor(line, column), Cursor(line, column))`.

#### Загальні функції (Global Functions)

У цьому розділі наведено всі загальні функції.

##### Читання і включення файлів

    String read(String назва файла);

  Виконає пошук файла з назвою назва файла у каталозі `katepart/script/files` і поверне його вміст як рядок.

    void require(String назва файла);

  Виконає пошук файла з назвою назва файла у каталозі `katepart/script/libraries` і обробить його код. У `require` передбачено вбудований захист від повторного включення одного і того самого файла.

  Актуальна версія: KDE 4.10

##### Налагоджування (Debugging)

    void debug(String текст);

  Виводить текст до `stdout` у консоль, з якої запущено програму.

##### Переклад (Translation)

Повноцінна локалізація стане можливою лише за використання декількох функцій, призначених для перекладу рядків у скриптах, а саме `i18n`, `i18nc`, `i18np` і `i18ncp`. Робота цих функцій подібна до роботи функцій перекладу рядків у KDE.

За допомогою функцій перекладу і системи перекладу KDE вбудовані у скрипт рядки повідомлень може бути перекладено мовою інтерфейсу програми. Рядки у скриптах, які є частиною офіційної збірки &kappname; буде автоматично видобуто і подано для перекладу командами перекладачів KDE. Іншими словами, якщо ви є розробником основної гілки &kappname;, ви не маєте перейматися видобуванням повідомлень і їхнім перекладом. Якщо ж скрипт є стороннім, його розробка виконується поза межами KDE, вам слід подбати про видобування і переклад повідомлень власноруч. Разом зі скриптами вам слід поширювати і файли перекладів, які міститимуть всі придатні для перекладу рядки. Крім того, у заголовку вашого скрипту має бути явним чином вказано каталог перекладів, який слід завантажити. Зробити це можна за допомогою параметра `i18n-catalog`.

    void i18n(String текст, параметр1, ...);

  Перекладає текст мовою, використаною у інтерфейсі програми. Параметри параметр1, ... є необов’язковими. Вони є замінниками рядків `%1`, `%2` тощо.

    void i18nc(String контекст, String текст, параметр1, ...);

  Перекладає текст мовою, використаною у інтерфейсі програми. Крім того, перекладачі зможуть побачити рядок контекст. За допомогою контексту перекладачам буде простіше правильно перекласти рядок. Параметри параметр1, ... є необов’язковими. Вони є замінниками рядків `%1`, `%2` тощо.

    void i18np(String однина, String множина, int кількість, параметр1, ...);

  Перекладає однину або множину повідомлення мовою, використаною у інтерфейсі програми залежно від вказаного значення кількість. Параметри параметр1, ... є необов’язковими. Вони є замінниками рядків `%1`, `%2` тощо.

    void i18ncp(String контекст, String однина, String множина, int кількість, параметр1, ...);

  Перекладає однину або множину повідомлення мовою, використаною у інтерфейсі програми залежно від вказаного значення кількість. Крім того, перекладачі зможуть побачити рядок контекст. За допомогою контексту перекладачам буде простіше правильно перекласти рядок. Параметри параметр1, ... є необов’язковими. Вони є замінниками рядків `%1`, `%2` тощо.

#### Програмний інтерфейс `View`

Яким би чином не було запущено скрипт, він завжди користуватиметься загальною змінною `view`, що відповідає поточній активній панелі перегляду. Нижче наведено список всіх типових функцій об’єкта View.

    Cursor view.cursorPosition()

  Повертає поточну позицію курсора у області перегляду.

    void view.setCursorPosition(int рядок, int стовпчик);
    void view.setCursorPosition(Cursor курсор);

  Встановлює для поточного курсора позицію, вказану напряму (рядок, стовпчик), або позицію вказаного курсора.

    Cursor view.virtualCursorPosition();

  Повертає позицію віртуального курсора. Всі символи табуляцій буде враховано за допомогою відповідної кількості пробілів, яка залежатиме від поточної ширини табуляції.

    void view.setVirtualCursorPosition(int рядок, int стовпчик);
    void view.setVirtualCursorPosition(Cursor курсор);

  Встановлює для віртуального курсора позицію, вказану напряму (рядок, стовпчик), або позицію вказаного курсора.

    String view.selectedText();

  Повертає позначений фрагмент тексту. Якщо жодного фрагменту не позначено, повертає порожній рядок.

    bool view.hasSelection();

  Повертає `true`, якщо у області перегляду позначено фрагмент тексту, інакше повертає `false`.

    Range view.selection();

  Повертає діапазон позначеного фрагменту тексту. Якщо жодного фрагменту не позначено, буде повернуто некоректний діапазон.

    void view.setSelection(Range діапазон);

  Встановлює позначення тексту за вказаним діапазоном.

    void view.removeSelectedText();

  Вилучає позначений текст. Якщо у області перегляду не було позначено жодного тексту, ніяких дій виконано не буде.

    void view.selectAll();

  Позначає весь текст у документі.

    void view.clearSelection();

  Знімає позначення фрагменту тексту, не вилучаючи сам текст.

#### Програмний інтерфейс (API) `Document`

Яким би чином не було запущено скрипт, він завжди користуватиметься загальною змінною `document`, що відповідає поточній активній панелі перегляду. Нижче наведено список всіх типових функцій об’єкта Document.

    String document.fileName();

  Повертає назву файла документа або порожній рядок для незбережених буферів з текстом.

    String document.url();

  Повертає адресу URL документа повністю або порожній рядок для незбережених буферів з текстом.

    String document.mimeType();

  Повертає тип MIME документа або тип MIME `application/octet-stream`, якщо відповідного типу MIME встановити не вдасться.

    String document.encoding();

  Повертає поточне кодування символів, яке буде використано для збереження даних файла.

    String document.highlightingMode();

  Повертає загальний режим підсвічування, використаний у всьому документі.

    String document.highlightingModeAt(Cursor позиція);

  Повертає режим підсвічування, використаний за вказаною позицією у тексті.

    Array document.embeddedHighlightingModes();

  Повертає масив режимів підсвічування, вбудованих до поточного документа.

    bool document.isModified();

  Повертає `true`, якщо у документі є незбережені зміни, інакше повертає `false`.

    String document.text();

  Повертає увесь вміст документа у формі єдиного рядка тексту. Розриви рядків буде позначено символом розриву рядка `\n`.

    String document.text(int зРядка, int зіСтовпчика, int доРядка, int доСтовпчика);
    String document.text(Cursor з, Cursor до);
    String document.text(Range діапазон);

  Повертає фрагмент тексту у вказаному діапазоні. Для того, щоб код було легше читати, ми рекомендуємо вам використовувати засновану на об’єктах Cursor і Range версію функції.

    String document.line(int рядок);

  Повертає рядок за його номером у тексті. Якщо вказаний номер не належатиме до діапазону номерів рядків документа, буде повернуто порожній рядок.

    String document.wordAt(int рядок, int стовпчик);
    String document.wordAt(Cursor курсор);

  Повертає слово за вказаною позицією курсора.

    Range document.wordRangeAt(int рядок, int стовпчик);
    Range document.wordRangeAt(Cursor курсор);

  Повертає діапазон слова за вказаним розташуванням курсора. Повернуте значення діапазону буде некоректним (див. Range.isValid()), якщо текст розташовано за кінцем рядка. Якщо за вказаним розташуванням курсора не буде слова, функцією буде повернуто порожній діапазон.

  Актуальна версія: KDE 4.9

    String document.charAt(int рядок, int стовпчик);
    String document.charAt(Cursor курсор);

  Повертає символ за вказаною позицією курсора.

    String document.firstChar(int рядок);

  Повертає перший символ вказаного рядка рядок, який не є пробілом. Першим символом рядка вважається символ у стовпчику 0. Якщо рядок є порожнім або складається лише з пробілів, функція повертає порожній рядок.

    String document.lastChar(int рядок);

  Повертає останній символ вказаного рядка рядок, який не є пробілом. Якщо рядок є порожнім або складається лише з пробілів, функція повертає порожній рядок.

    bool document.isSpace(int рядок, int стовпчик);
    bool document.isSpace(Cursor курсор);

  Повертає `true`, якщо символ у вказаній позиції курсора є пробілом. Якщо це не так, повертає `false`.

    bool document.matchesAt(int рядок, int стовпчик, String текст);
    bool document.matchesAt(Cursor курсор, String текст);

  Повертає `true`, якщо вказаний текст розташовано за відповідною позицією курсора. Якщо це не так, повертає `false`.

    bool document.startsWith(int рядок, String текст, bool пропускатиПробіли);

  Повертає `true`, якщо рядок з вказаним номером починається з фрагмента тексту текст. Якщо це не так, повертає `false`. За допомогою параметра пропускатиПробіли можна вказати програмі, чи слід ігнорувати пробіли.

    bool document.endsWith(int рядок, String текст, bool пропускатиПробіли);

  Повертає `true`, якщо рядок з вказаним номером завершується фрагментом тексту текст. Якщо це не так, повертає `false`. За допомогою параметра пропускатиПробіли можна вказати програмі, чи слід ігнорувати пробіли.

    bool document.setText(String текст);

  Замінює весь вміст документа на `текст`.

    bool document.clear();

  Вилучає з документа весь текст.

    bool document.truncate(int рядок, int стовпчик);
    bool document.truncate(Cursor курсор);

  Обрізає рядок з вказаним номером на вказаному стовпчику або позиції курсора. Повертає `true` у разі успіху або `false`, якщо рядка з вказаним номером у документі немає.

    bool document.insertText(int рядок, int стовпчик, String текст);
    bool document.insertText(Cursor курсор, String текст);

  Вставляє фрагмент тексту текст у вказану позицію курсора. Повертає `true` у разі успіху або `false`, якщо документ відкрито у режимі лише для читання.

    bool document.removeText(int зРядка, int зіСтовпчика, int доРядка, int доСтовпчика);
    bool document.removeText(Cursor з, Cursor до);
    bool document.removeText(Range діапазон);

  Вилучає текст у вказаному діапазоні. Повертає `true` у разі успіху або `false`, якщо документ відкрито у режимі лише для читання.

    bool document.insertLine(int рядок, String текст);

  Вставляє вказаний фрагмент тексту до рядка з вказаним номером. Повертає `true` у разі успіху або `false`, якщо документ відкрито у режимі лише для читання або рядка з вказаним номером у документі немає.

    bool document.removeLine(int рядок);

  Вилучає рядок з вказаним номером. Повертає `true` у разі успіху або `false`, якщо документ відкрито у режимі лише для читання або рядка з вказаним номером у документі немає.

    bool document.wrapLine(int рядок, int стовпчик);
    bool document.wrapLine(Cursor курсор);

  Обрізає рядок з вказаним номером за вказаним розташуванням курсора. Повертає `true` у разі успіху. У інших випадках повертає `false` (наприклад, якщо номер рядка < 0).

  Актуальна версія: KDE 4.9

    void document.joinLines(int початковийРядок, int кінцевийРядок);

  Об’єднує рядки у діапазоні відпочатковийРядок до кінцевийРядок. Послідовні рядки тексту завжди відокремлюються одинарним пробілом.

    int document.lines();

  Повертає кількість рядків у документі.

    int document.length();

  Повертає кількість символів у документі.

    int document.lineLength(int рядок);

  Повертає довжину рядка з номером рядок.

    void document.editBegin();

  Започатковує групу редагування для впорядкування операцій зі скасування або повторення дій. Не забувайте, що викликати `editEnd()` слід саме стільки разів, скільки разів було викликано `editBegin()`. Виклики `editBegin()` використовують вбудований лічильник, отже їх може бути вкладено один у оден.

    void document.editEnd();

  Завершує групу редагування. Останній виклик `editEnd()` (тобто відповідник першого виклику `editBegin()`) завершує крок з редагування.

    int document.firstColumn(int рядок);

  Повертає перший відмінний від пробілу стовпчик у вказаному за допомогою параметра номера, рядок, рядку. Якщо у рядку будуть лише пробіли, функція поверне значення `-1`.

    int document.lastColumn(int рядок);

  Повертає останній відмінний від пробілу стовпчик у вказаному за допомогою параметра номера, рядок, рядку. Якщо у рядку будуть лише пробіли, функція поверне значення `-1`.

    int document.prevNonSpaceColumn(int рядок, int стовпчик);
    int document.prevNonSpaceColumn(Cursor курсор);

  Повертає номер стовпчика з символом, відмінним від пробілу. Пошук буде виконано у напрямку початку документа, починаючи з вказаної позиції курсора.

    int document.nextNonSpaceColumn(int рядок, int стовпчик);
    int document.nextNonSpaceColumn(Cursor курсор);

  Повертає номер стовпчика з символом, відмінним від пробілу. Пошук буде виконано у напрямку кінця документа, починаючи з вказаної позиції курсора.

    int document.prevNonEmptyLine(int рядок);

  Повертає наступний непорожній рядок, що містить символи, відмінні від пробілів. Пошук відбуватиметься у напрямку початку документа.

    int document.nextNonEmptyLine(int рядок);

  Повертає наступний непорожній рядок, що містить символи, відмінні від пробілів. Пошук відбуватиметься у напрямку кінця документа.

    bool document.isInWord(String символ, int атрибут);

  Повертає `true`, якщо вказаний символ з вказаним параметром атрибут може бути частиною слова. Якщо це не так, повертає `false`.

    bool document.canBreakAt(String символ, int атрибут);

  Повертає `true`, якщо вказаний символ з вказаним параметром атрибут може бути використано для розбиття рядка. Якщо це не так, повертає `false`.

    bool document.canComment(int атрибутПочатку, int атрибутКінця);

  Повертає `true`, якщо діапазон тексту, початок і кінець якого визначаються на основі вказаних атрибутів, можна закоментувати. Якщо це не так, повертає `false`.

    String document.commentMarker(int атрибут);

  Повертає позначку коментаря для окремого рядка коментарів з вказаним параметром атрибут.

    String document.commentStart(int атрибут);

  Повертає позначку, якою має розпочинатися багаторядковий коментар для вказаного значення параметра атрибут.

    String document.commentEnd(int атрибут);

  Повертає позначку, якою має розпочинатися багаторядковий коментар для вказаного значення параметра атрибут.

    int document.attribute(int рядок, int стовпчик);
    int document.attribute(Cursor курсор);

  Повертає атрибут за вказаною позицією курсора.

    bool document.isAttribute(int рядок, int стовпчик, int атрибут);
    bool document.isAttribute(Cursor курсор, int атрибут);

  Повертає `true`, якщо атрибут за вказаною позицією курсора дорівнює значенню параметра атрибут. Якщо це не так, повертає `false`.

    String document.attributeName(int рядок, int стовпчик);
    String document.attributeName(Cursor курсор);

  Повертає назву атрибута придатну до читання. Ця назва відповідає назві `itemData` у файлах підсвічування синтаксичних конструкцій.

    bool document.isAttributeName(int рядок, int стовпчик, String назва);
    bool document.isAttributeName(Cursor курсор, String назва);

  Повертає `true`, якщо назва атрибута у певній позиції курсора відповідає вказаному значенню параметра назва. Якщо це не так, повертає `false`.

    String document.variable(String ключ);

  Повертає значення вказаної змінної документа ключ. Якщо змінної з вказаною назвою у документі не існує, повертає порожній рядок.

    String document.setVariable(String ключ, String значення);

  Встановлює значення відповідної змінної документа ключ. Повертає встановлене значення змінної.

  Див. також змінні документа Kate

  Актуальна версія: KDE 4.8

    int document.firstVirtualColumn(int рядок);

  Повертає віртуальний стовпчик першого відмінного від пробілу символу у вказаному рядку або `-1`, якщо рядок є порожнім або містить лише символи пробілів.

    int document.lastVirtualColumn(int рядок);

  Повертає віртуальний стовпчик останнього відмінного від пробілу символу у вказаному рядку або `-1`, якщо рядок є порожнім або містить лише символи пробілів.

    int document.toVirtualColumn(int рядок, int стовпчик);
    int document.toVirtualColumn(Cursor курсор);
    Cursor document.toVirtualCursor(Cursor курсор);

  Перетворює вказану «реальну» позицію курсора на віртуальну позицію курсора, повертає або ціле значення (int), або об’єкт Cursor.

    int document.fromVirtualColumn(int line, int virtualColumn);
    int document.fromVirtualColumn(Cursor virtualCursor);
    Cursor document.fromVirtualCursor(Cursor віртуальнийКурсор);

  Перетворює вказану віртуальну позицію курсора на «реальну» позицію курсора, повертає або ціле значення (int), або об’єкт Cursor.

    Cursor document.anchor(int рядок, int стовпчик, Char символ);
    Cursor document.anchor(Cursor курсор, Char символ);

  Виконує пошук у напрямку початку документа, починаючи від вказаної позиції курсора, вказаного символу. Наприклад, якщо функції буде передано символ «(», функція поверне позицію початкової дужки «(». Відповідність дужок не враховуватиметься, тобто інші «(...)» буде проігноровано.

    Cursor document.rfind(int рядок, int стовпчик, String текст, int атрибут = -1);
    Cursor document.rfind(Cursor курсор, String текст, int атрибут = -1);

  Виконує пошук у напрямку початку документа вказаного фрагмента тексту з відповідним значенням параметра атрибут. Параметр атрибут буде проігноровано, якщо він матиме значення `-1`. Функція поверне значення некоректного курсора, якщо фрагмент тексту знайти не вдасться.

    int document.defStyleNum(int рядок, int стовпчик);
    int document.defStyleNum(Cursor курсор);

  Повертає типовий стиль курсора, використаний за вказаною позицією у тексті.

    bool document.isCode(int рядок, int стовпчик);
    bool document.isCode(Cursor курсор);

  Повертає `true`, якщо атрибут за вказаною позицією курсора не дорівнює жодному зі значень стилів: `dsComment`, `dsString`, `dsRegionMarker`, `dsChar`, `dsOthers`.

    bool document.isComment(int рядок, int стовпчик);
    bool document.isComment(Cursor курсор);

  Повертає `true`, якщо значенням атрибута символу у позиції курсора є `dsComment`. Якщо це не так, повертає `false`.

    bool document.isString(int рядок, int стовпчик);
    bool document.isString(Cursor курсор);

  Повертає `true`, якщо значенням атрибута символу у позиції курсора є `dsString`. Якщо це не так, повертає `false`.

    bool document.isRegionMarker(int рядок, int стовпчик);
    bool document.isRegionMarker(Cursor курсор);

  Повертає `true`, якщо значенням атрибута символу у позиції курсора є `dsRegionMarker`. Якщо це не так, повертає `false`.

    bool document.isChar(int рядок, int стовпчик);
    bool document.isChar(Cursor курсор);

  Повертає `true`, якщо значенням атрибута символу у позиції курсора є `dsChar`. Якщо це не так, повертає `false`.

    bool document.isOthers(int рядок, int стовпчик);
    bool document.isOthers(Cursor курсор);

  Повертає `true`, якщо значенням атрибута символу у позиції курсора є `dsOthers`. Якщо це не так, повертає `false`.

## Розширення компонента редактора

Розширення компонента редактора удосконалюють можливості KatePart, компонента редагування текстів з розширеними можливостями, що використовується у багатьох програмах &kde;, зокрема &kate;, &kwrite;, Kile та KDevelop. Створення додатка компонента редактора надасть вам змогу розширити можливості будь-якої з цих програм.

Для початку ознайомтеся з підручником зі створення додатка KTextEditor на TechBase &kde;. Додаткові відомості можна знайти у розширеному довіднику, також на TechBase.

Повну документації щодо програмного інтерфейсу можна знайти на довідковій сторінці щодо програмних інтерфейсів &kde;.

## Додатки до програми &kate; (C++)

Додатки до програми Kate розширюють можливості самого редактора &kate; у будь-який спосіб, який можна собі уявити, за допомогою тієї самої мови програмування, якою написано &kate;, C++.

Для початку ознайомтеся з підручником щодо написання додатків &kate; на сайті &kate;. Ви також можете скористатися класичним прикладом мінімального додатка, включеним до початкового коду &kate;.

## Додатки для розробки мовою Python &pate;

Додатки &pate; також надають змогу розширити можливості &kate; у будь-який бажаний спосіб, але за допомогою мови програмування Python.

Для початку ознайомтеся з підручником з розробки мовою Python на сайті &kate;.

З довідковими даними щодо програмного інтерфейсу можна також ознайомитися за допомогою вікна налаштовування &pate;.