&TC.Hollingsworth; &TC.Hollingsworth.mail;
&traductor.Antoni.Bella;

# Estendre &kate;

## Introducció

Igual que qualsevol editor de text avançat, &kate; ofereix una varietat de maneres d'estendre la seva funcionalitat. Podeu escriure scripts senzills per afegir funcionalitat amb JavaScript, afegir funcionalitat millorada al component d'edició amb Connectors del component d'edició, o afegir encara més funcionalitat a l'editor els Connectors d'aplicació &kate; escrits en C++ o els Connectors &pate; escrits en Python. Finalment, un cop estengueu &kate;, sereu benvingut a unir-vos amb nosaltres i compartir les vostres millores amb el món!

## Crear scripts amb JavaScript

Des de &kappname; 3.4 de KDE 4.4 el component d'edició de &kappname; és fàcilment extensible, escrivint scripts. El llenguatge per crear scripts és ECMAScript (conegut com Javascript). &kappname; admet dos tipus d'script: el sagnat i els scripts de línia d'ordres.

### Scripts de sagnat

Els scripts de sagnat: També coneguts com «indenters», sagnen automàticament el codi font en escriure text. Com a exemple, després de tocar la tecla de retorn el nivell de sagnat sovint és incrementat.

En les següents seccions es descriuen pas a pas com crear l'esquelet d'un sagnat simple. Com a primer pas, creeu una nou fitxer `*.js` anomenat &pex;, `javascript.js` a la carpeta d'inici local `$KDEHOME/share/apps/katepart/script/indentation`.

#### La capçalera de l'script de sagnat

La capçalera del fitxer `javascript.js` està encastada en un comentari i és de la forma següent

    /* kate-script
     * name: JavaScript
     * author: Nom exemple <nom.exemple@alguna.adreça.org>
     * license: BSD
     * revision: 1
     * kate-version: 3.4
     * required-syntax-style: javascript
     * indent-languages: javascript
     * priority: 0
     * i18n-catalog: mycatalog
     *
    * Una línia sense punts «:» atura l'anàlisi de la capçalera. És a dir, podeu * afegir text opcional aquí com una llicència detallada. */

Cada entrada s'explica en detall tot seguit:

- `kate-script` [requerit]: Aquesta cadena de text ha d'aparèixer a la primera línia del fitxer `*.js`, en cas contrari el &kappname; omet l'script.

- `name` [requerit]: Aquest és el nom del sagnat que apareix al menú Eines Sagnat i en el diàleg de configuració.

- `author` [opcional]: El nom de l'autor i la informació de contacte.

- `license` [opcional]: La forma curta de la llicència, com ara BSD o LGPLv3.

- `revision` [requerit]: La revisió de l'script. Aquest número ha de ser major cada vegada que l'script es modifica.

- `kate-version` [requerit]: La versió mínima requerida per &kappname;.

- `required-syntax-style` [opcional]: Llista separada per comes dels estils de ressaltat de la sintaxi. Això és important per als sagnats que es basen en la informació de ressaltat específica en el document. Si s'especifica un estil de sintaxi requerit, el sagnat només estarà disponible amb el ressaltat actiu apropiat. Això evita «comportament sense definir» causat per l'ús del sagnat sense l'esquema de ressaltat esperat. Per exemple, el sagnat de Ruby en fa ús en els fitxers `ruby.js` i `ruby.xml`.

- `indent-languages` [opcional]: Llista separada per comes dels estils de sintaxi que pot sagnar correctament, &pex;: c++, java.

- `priority` [opcional]: Si els diversos sagnats són adequats per a un determinat fitxer ressaltat, la prioritat decideix quin sagnat és triat com sagnat per omissió.

- `i18n-catalog` [opcional]: Catàleg de missatges addicionals (fitxer `po`) carregat per a la traducció de sagnats de terceres parts.

&kappname; llegeix tots els parells de la forma «clau:valor» fins que no es trobin més dos punts. Això implica que la capçalera pot contenir text arbitrari, com una llicència, com es mostra en l'exemple.

#### El codi font del sagnat

Després d'haver especificat la capçalera aquesta secció explica com funciona la creació d'scripts de sagnat. L'esquelet bàsic del cos s'assembla a això:

    // es necessiten les biblioteques «js» de katepart, per exemple, «range.js»
    // si utilitzeu «Range»
    require ("range.js");

    triggerCharacters = "{}/:;";
    function indent(line, indentWidth, ch)
    {
        // crida per a cada línia nova (ch == «\n») i tots els caràcters s'especifiquen en
        // la variable global triggerCharacters. Quan es crida EinesAlinea
        // la variable ch és buidada, &ead;, ch == «».
        //
        // Veure també: L'API per a la creació d'scripts
        return -2;
    }

La funció `indent()` té tres paràmetres:

- `line`: La línia que ha d'estar amb sagnat.

- `indentWidth`: L'amplada del sagnat en quantitat d'espais.

- `ch`: o bé un caràcter de línia nova (`ch == '\n'`),el caràcter de tall especificat en `triggerCharacters` o buida si l'usuari invoca l'acció Eines Alinea.

El valor retornat de la funció `indent()` especifica com se sagna la línia. Si el valor retornat és un nombre enter simple, aquest s'interpreta de la següent manera:

- El valor retornat `-2`: No fa res.

- El valor retornat `-1`: Es manté el sagnat (cerca la línia anterior que no estigui en blanc).

- El valor retornat `0`: Un número >= 0 especifica la profunditat del sagnat en nombre d'espais.

Alternativament, un conjunt de dos elements es poden retornar:

- `return [ indent, align ];`

En aquest cas, el primer element és la profunditat de sagnat com anteriorment amb el mateix significat dels valors especials. No obstant, el segon element és un valor absolut que representa una columna d'«alineació». Si aquest valor és major que el valor de sagnat, la diferència representa un nombre d'espais a afegir després del sagnat del primer paràmetre. En cas contrari, el segon nombre serà ignorat. L'ús de tabulacions i espais per al sagnat sovint és referit com «mode mixt».

Considerem el següent exemple: Suposem que s'usen tabulacions per a sagnar, i l'amplada de la tabulació és 4. Aquí, <tab> representa una tabulació i «.» un espai:

    1: <tab><tab>foobar("hola",
    2: <tab><tab>......."món");

Quan se sagna la línia 2, la funció `indent()` retorna [8, 15]. Com a resultat, s'insereixen dues tabulacions per a sagnar fins a la columna 8, i s'afegeixen 7 espais per alinear el segon paràmetre a la primera, de manera que quedi alineat si el fitxer es veu amb una amplada de tabulació diferent.

Una instal·lació per omissió de KDE ens dóna el &kappname; amb diversos sagnats. El corresponent codi font de JavaScript d'origen pot trobar-se en `$KDEDIR/share/apps/katepart/script/indentation`.

El desenvolupament d'un sagnat requereix tornar a carregar els scripts per veure si els canvis es comporten adequadament. En comptes de reiniciar l'aplicació, simplement canvieu a la línia d'ordres i crideu l'ordre `reload-scripts`.

Si desenvolupeu scripts útils, si us plau, considereu el contribuir al projecte &kappname; posant-vos en contacte amb la llista de correu.

### Els scripts de la línia d'ordres

Com és difícil satisfer les necessitats de tothom, el &kappname; suporta unes quantes eines d'ajuda per a la manipulació ràpida de text a través de la línia d'ordres encastada. Per exemple, l'ordre `sort` s'implementa com script. En aquesta secció s'explica com crear fitxers `*.js` per estendre el &kappname; amb scripts d'ajuda arbitrària.

Scripts de línia d'ordres es troben en la mateixa carpeta que els scripts de sagnat. Així que com a primer pas, creeu un nou fitxer `*.js` anomenat `myutils.js` a la carpeta d'inici local `$KDEHOME/share/apps/katepart/script/commands`.

#### La capçalera de l'script de línia d'ordres

La capçalera de cada script de línia d'ordres està integrada en un comentari i és en la forma següent

    /* kate-script
     * author: Nom exemple <nom.exemple@alguna.adreça.org>
     * license: BSD
     * revision: 1
     * kate-version: 3.4
     * functions: sort, format-paragraph
     * i18n-catalog: mycatalog
     *
     * Una línia sense dos punts «:» atura l'anàlisi de la capçalera. És a dir,
     * podeu afegir text opcional com una llicència detallada.
     */

Cada entrada s'explica en detall tot seguit:

- `kate-script` [requerit]: Aquesta cadena de text ha d'aparèixer a la primera línia del fitxer `*.js`, en cas contrari el &kappname; omet l'script.

- `author` [opcional]: El nom de l'autor i la informació de contacte.

- `license` [opcional]: La forma curta de la llicència, com ara BSD o LGPLv3.

- `revision` [requerit]: La revisió de l'script. Aquest número ha de ser major cada vegada que l'script es modifica.

- `kate-version` [requerit]: La versió mínima requerida per &kappname;.

- `functions` [requerit]: Llista separada per comes de les ordres en l'script.

- `i18n-catalog` [opcional]: Catàleg de missatges addicionals (fitxer `po`) carregat per a la traducció d'scripts de terceres parts.

&kappname; llegeix tots els parells de la forma «clau:valor» fins que no es trobin més dos punts. Això implica que la capçalera pot contenir text arbitrari, com una llicència, com es mostra en l'exemple. El valor de les funcions clau és una llista separada per comes de les ordres en la línia d'ordres. Això significa que un únic script conté una quantitat arbitrària d'ordres de la línia d'ordres. Cada funció està disponible a través de la línia d'ordres encastada de &kappname;.

#### El codi font de l'script

Totes les funcions especificades a la capçalera s'han d'implementar a l'script. Per exemple, el fitxer d'script en l'exemple anterior necessita implementar les dues funcions `sort` i `format-paragraph`. Totes les funcions tenen la següent sintaxi:

    // es necessiten les biblioteques «js» de katepart, per exemple, «range.js»
    // si utilitzeu «Range»
    require ("range.js");

    function <nom>(arg1, arg2...)
    {
        // ... implementació, veure també: L'API per a la creació d'scripts.
    }

Els arguments en la línia d'ordres es passen a la funció com `arg1`, `arg2`, &etc; Per tal de proveir documentació per a cada ordre, simplement implementeu la funció «`help`» de la següent manera:

    {
        if (cmd == "sort") {
            return i18n("Ordena el text seleccionat.");
        } else if (cmd == "...") {
            // ...
        }
    }

Executar `help sort` en la línia d'ordres crida a aquesta funció d'ajuda amb l'argument `cmd` establert en l'ordre donada, &ead;, `cmd == "sort"`. &kappname; presentarà el text retornat com documentació per a l'usuari. Assegureu-vos de traduir les cadenes.

##### Vincular dreceres

Per tal de poder assignar dreceres, l'script ha de proporcionar una funció anomenada `action` de la següent manera:

    function action(cmd)
    {
        var a = new Object();
        if (cmd == "sort") {
            a.text = i18n("Ordena el text seleccionat");
            a.icon = "";
            a.category = "";
            a.interactive = false;
            a.shortcut = "";
        } else if (cmd == "moveLinesDown") {
            // El mateix per a la següent acció
        }
        return a;
    }

El paràmetre `cmd` de la funció específica l'ordre per al qual es demana una drecera. Hi ha diversos camps que heu d'especificar en l'objecte javascript retornat:

- `a.text` [requerit]: El text apareix en el menú Eines Scripts. Assegureu-vos d'utilitzar `i18n` per a la traducció.

- `a.icon` [opcional]: La icona apareix al costat del text en el menú. Aquí es poden usar tots els noms d'icones del KDE.

- `a.category` [opcional]: Si s'especifica una categoria, l'script apareixerà en un submenú. Assegureu-vos d'utilitzar `i18n` per a la traducció.

- `a.interactive` [opcional]: Si l'script necessita usar l'entrada, establiu-ho a `true` (vertader).

- `a.shortcut` [opcional]: La drecera que aquí és la drecera per omissió. Exemple: Ctrl+Alt+t. Per a més detalls consulteu la Documentació de Qt.

El desenvolupament d'un script de línia d'ordres requereix tornar a carregar els scripts per veure si els canvis es comporten adequadament. En comptes de reiniciar l'aplicació, simplement canvieu a la línia d'ordres i crideu l'ordre `reload-scripts`.

Si desenvolupeu scripts útils, si us plau, considereu el contribuir al projecte &kappname; posant-vos en contacte amb la llista de correu.

### L'API per a la creació d'scripts

L'API per a la creació d'scripts que es presenta aquí està disponible en tots els scripts, &pex;, els scripts d'exemple de sagnat i ordres de línia d'ordres. Els `Cursor` i `Range` són proporcionats pels fitxers de la biblioteca a `$KDEDIR/share/apps/katepart/libraries`. Si voleu utilitzar-los en el seu vostre script, serà necessari utilitzar algunes de les funcions `Document` o `View`, si us plau, afegiu la biblioteca necessària mitjançant:

    // es necessiten les biblioteques «js» de katepart, per exemple, «range.js»
    // si utilitzeu «Range»
    require ("range.js");

Per estendre la norma de l'API per a la creació d'scripts amb les funcions i prototips propis n'hi ha prou amb crear un nou fitxer a la carpeta de configuració local del KDE `$KDEHOME/share/apps/katepart/libraries` i incloure'l en l'script utilitzant:

    require ("nom_script.js");

Per estendre els prototips com `Cursor` o `Range`, la manera més recomanable és no modificar els fitxers `*.js` globals. En el seu lloc, canvieu el prototip `Cursor` en JavaScript després afegiu el `cursor.js` al vostre script mitjançant `require`.

#### Cursors i intervals

Com &kappname; és un editor de text, tota l'API per a la creació d'scripts es basa en els cursors i els intervals sempre que sigui possible. Un Cursor és una simple `(line, column)` que representa una posició del text en el document. Un «Range» s'estén pel text des de la posició del cursor fins a una posició final del cursor. L'API s'explica amb detall en les següents seccions.

##### El prototip de «Cursor»

    Cursor();

  Constructor. Retorna un cursor a la posició `(0, 0)`.

  Exemple: `var cursor = new Cursor();`

    Cursor(int línia, int columna);

  Constructor. Retorna un cursor a la posició (línia, columna).

  Exemple: `var cursor = new Cursor(3, 42);`

    Cursor(Cursor altra);

  El constructor de còpia. Retorna una còpia del cursor altra.

  Exemple: `var copy = new Cursor(altra);`

    Cursor Cursor.clone();

  Retorna una còpia del cursor.

  Exemple: `var clone = cursor.clone();`

    Cursor.setPosition(int línia, int columna);

  Estableix la posició del cursor a línia i columna.

  Des de: KDE 4.11

    bool Cursor.isValid();

  Comproveu si el cursor és vàlid. El cursor no és vàlid, si la línia i/o la columna s'estableix a `-1`.

  Exemple: `var valid = cursor.isValid();`

    Cursor Cursor.invalid();

  Retorna un nou cursor no vàlid situat a `(-1, -1)`.

  Exemple: `var invalidCursor = cursor.invalid();`

    int Cursor.compareTo(Cursor altra);

  Compara aquest cursor al cursor altra. Retorna

  - `-1`, si el cursor està situat abans del cursor altra,

  - `0`, si tots dos cursors són iguals i

  - `+1`, si el cursor està situat després del cursor altra.

    bool Cursor.equals(Cursor altra);

  Retorna `true` (vertader), si aquest cursor i el cursor altra són iguals, en cas contrari retornarà `false` (fals).

    String Cursor.toString();

  Retorna el cursor com una cadena de la forma `Cursor(line, column)`.

##### El prototip «Range»

    Range();

  El constructor. Crida `new Range()` retornant un interval (0, 0) - (0, 0).

    Range(Cursor inici, Cursor final);

  El constructor. Crida `new Range(inici, final)` retorna l'interval (inici, final).

    Range(int líniaInici, int columnaInici, int líniaFinal, int columnaFinal);

  El constructor. Crida `new Range(líniaInici, columnaInici, líniaFinal, columnaFinal)` retorna l'interval de (líniaInici, columnaInici) a (líniaFinal, columnaFinal).

    Range(Range altra);

  El constructor de còpia. Retorna una còpia de l'interval altra.

    Range Range.clone();

  Retorna una còpia de l'interval rang.

  Exemple: `var clone = range.clone();`

    bool Range.isEmpty();

  Retorna `true` (vertader), si inici i final del cursor són iguals.

  Exemple: `var empty = range.isEmpty();`

  Des de: KDE 4.11

    bool Range.isValid();

  Retorna `true` (vertader), si inici i final del cursor són vàlids, en cas contrari retornarà `false` (fals).

  Exemple: `var valid = range.isValid();`

    Range Range.invalid();

  Retorna l'interval de (-1, -1) a (-1, -1).

    bool Range.contains(Cursor cursor);

  Retorna `true` (vertader) si aquest interval conté la posició de cursor, en cas contrari retornarà `false` (fals).

    bool Range.contains(Range altra);

  Retorna `true` (vertader), si aquest interval conté l'interval altra, en cas contrari retornarà `false` (fals).

    bool Range.containsColumn(int columna);

  Retorna `true` (vertader), si columna està en l'interval obert medi `[start.column, end.column)`, en cas contrari retornarà `false` (fals).

    bool Range.containsLine(int línia);

  Retorna `true` (vertader), si línia està en l'interval obert medi `[start.line, end.line)`, en cas contrari retornarà `false` (fals).

    bool Range.overlaps(Range altra);

  Retorna `true` (vertader), si aquest interval i l'interval altra comparteixen una regió comuna, en cas contrari retornarà `false` (fals).

    bool Range.overlapsLine(int línia);

  Retorna `true` (vertader), si línia està en l'interval `[start.line, end.line]`, en cas contrari retornarà `false` (fals).

    bool Range.overlapsColumn(int columna);

  Retorna `true` (vertader), si columna està en l'interval `[start.column, end.column]`, en cas contrari retornarà `false` (fals).

    bool Range.onSingleLine();

  Retorna `true` (vertader), si l'interval comença i finalitza a la mateixa línia, &ead; si Línia.comença.interval == Línia.finalitza.interval.

  Des de: KDE 4.9

    bool Range.equals(Range altra);

  Retorna `true` (vertader), si aquest interval i l'interval de altra són iguals, en cas contrari retornarà `false` (fals).

    String Range.toString();

  Retorna l'interval com una cadena de la forma «`Rang(Cursor(line, column), Cursor(line, column))`».

#### Funcions globals

Aquesta secció llista totes les funcions globals.

##### Llegir i incloure fitxers

    String read(String fitxer);

  Cercarà el fitxer donat en relació al directori `katepart/script/files` i retorna el seu contingut com una cadena.

    void require(String fitxer);

  Cercarà el fitxer donat en relació al directori `katepart/script/libraries` i l'avaluarà. `require` està internament protegit contra inclusions múltiples del mateix fitxer.

  Des de: KDE 4.10

##### Depuració

    void debug(String text);

  Imprimeix text a `stdout` a la consola de llançament de l'aplicació.

##### Traducció

Per tal de donar suport a la completa localització, hi ha diverses funcions per convertir cadenes en els scripts, anomenades `i18n`, `i18nc`, `i18np` i `i18ncp`. Aquestes funcions es comporten exactament com les funcions de traducció del KDE.

Les funcions de traducció tradueixen les cadenes embolcallades a través del sistema de traducció del &kde; per a l'idioma utilitzat en l'aplicació. Les cadenes als scripts es desenvolupen a les fonts oficials de &kappname; i s'extrauen de forma automàtica i traduïble. En altres paraules, com a desenvolupador de &kappname; no us haureu de preocupar per l'extracció de missatges i la traducció. No obstant, per als scripts desenvolupats per terceres parts fora del &kde;, haureu d'extreure i traduir els missatges vosaltres mateixos. Juntament amb els vostres scripts també haureu de distribuir un catàleg de traducció, que inclogui totes les cadenes traduïbles. A més, a la capçalera del vostre script haureu d'establir explícitament el catàleg a carregar especificant `i18n-catàleg`.

    void i18n(String text, arg1...);

  Tradueix text a la llengua utilitzada per l'aplicació. Els arguments arg1..., són opcionals i s'utilitzen per substituir els arguments `%1`, `%2`, &etc;

    void i18nc(String context, String text, arg1...);

  Tradueix text a la llengua utilitzada per l'aplicació. A més, la cadena context és visible als traductors perquè puguin oferir una millor traducció. Els arguments arg1..., són opcionals i s'utilitzen per substituir els arguments `%1`, `%2`, &etc;

    void i18np(String singular, String plural, int número, arg1...);

  Tradueix singular o plural a la llengua utilitzada per l'aplicació, en funció del número indicat. Els arguments arg1..., són opcionals i s'utilitzen per substituir els arguments `%1`, `%2`, &etc;

    void i18ncp(String context, String singular, String plural, int número, arg1...);

  Tradueix singular o plural a la llengua utilitzada per l'aplicació, en funció del número indicat. A més, la cadena context és visible als traductors perquè puguin oferir una millor traducció. Els arguments arg1..., són opcionals i s'utilitzen per substituir els arguments `%1`, `%2`, &etc;

#### L'API de «View»

Cada vegada que s'executa un script, si no hi ha una variable global «`view`» que representa la vista actual de l'editor actiu. La següent és una llista de totes les funcions «View» disponibles.

    Cursor view.cursorPosition()

  Retorna la posició actual del cursor en la vista.

    void view.setCursorPosition(int línia, int columna);
    void view.setCursorPosition(Cursor cursor);

  Estableix la posició actual del cursor a (línia, columna) o el cursor indicat.

    Cursor view.virtualCursorPosition();

  Retorna la posició del cursor virtual amb cada tabulació comptant la corresponent quantitat d'espais depenent de l'amplada de la tabulació actual.

    void view.setVirtualCursorPosition(int línia, int column);
    void view.setVirtualCursorPosition(Cursor cursor);

  Estableix la posició actual del cursor virtual (línia, columna) o el cursor indicat.

    String view.selectedText();

  Retorna el text seleccionat. Si no hi ha text seleccionat, la cadena retornada estarà buida.

    bool view.hasSelection();

  Retorna `true` (vertader), si la vista conté el text seleccionat, en cas contrari retornarà `false` (fals).

    Range view.selection();

  Retorna l'interval de text seleccionat. L'interval retornat no serà vàlid si no hi ha text seleccionat.

    void view.setSelection(Range rang);

  Estableix el text seleccionat a l'interval indicat.

    void view.removeSelectedText();

  Elimina el text seleccionat. Si la vista no té cap text seleccionat, no fa res.

    void view.selectAll();

  Selecciona el text sencer en el document.

    void view.clearSelection();

  Neteja la selecció de text sense esborrar-lo.

#### L'API de «Document»

Cada vegada que s'executa un script, si no hi ha una variable global «`document`» que representa el document actiu actual. La següent és una llista de totes les funcions de «Document» disponibles.

    String document.fileName();

  Retorna el nom de fitxer del document o una cadena buida per a la memòria cau de text sense desar.

    String document.url();

  Retorna l'URL complet del document o una cadena buida per a la memòria cau de text sense desar.

    String document.mimeType();

  Retorna el tipus mime del document o el tipus mime `application/octet-stream` si no es pot trobar un tipus mime adequat.

    String document.encoding();

  Retorna la codificació usada actualment per a desar el fitxer.

    String document.highlightingMode();

  Retorna el mode de ressaltat global usat per a tot el document.

    String document.highlightingModeAt(Cursor pos);

  Retorna el mode de ressaltat usat a la posició indicada en el document.

    Array document.embeddedHighlightingModes();

  Retorna una cadena de modes de ressaltat inclosos en aquest document.

    bool document.isModified();

  Retorna `true` (vertader), si el document conté canvis sense desar (modificat), en cas contrari retornarà `false` (fals).

    String document.text();

  Retorna el contingut complet del document en una cadena de text única. Els salts de línia estan marcats amb el caràcter de nova línia «`\n`».

    String document.text(int desdeLínia, int desdeColumna, int alaLínia, int alaColumna);
    String document.text(Cursor desde, Cursor a);
    String document.text(Range rang);

  Retorna el text a l'interval donat. Es recomana utilitzar el cursor i la versió basada en l'interval per a una millor lectura del codi font.

    String document.line(int línia);

  Retorna la línia de text donada com a cadena. La cadena estarà buida si la línia demanada està fora de l'interval.

    String document.wordAt(int línia, int columna);
    String document.wordAt(Cursor cursor);

  Retorna la paraula a la posició del cursor donada.

    Range document.wordRangeAt(int línia, int columna);
    Range document.wordRangeAt(Cursor cursor);

  Retorna l'interval de la paraula a la posició del cursor donada. L'interval retornat no serà vàlid (veure Range.isValid()), si la posició del text és després del final d'una línia. Si no hi ha paraula al cursor donat, es retornarà un interval buit.

  Des de: KDE 4.9

    String document.charAt(int línia, int columna);
    String document.charAt(Cursor cursor);

  Retorna el caràcter a la posició del cursor donada.

    String document.firstChar(int línia);

  Retorna el primer caràcter en la línia donada que no és un espai en blanc. El primer caràcter és a la columna 0. Si la línia està buida o només conté espais en blanc, la cadena retornada estarà buida.

    String document.lastChar(int línia);

  Retorna l'últim caràcter de la línia donada que no és un espai en blanc. Si la línia està buida o només conté espais en blanc, la cadena retornada estarà buida.

    bool document.isSpace(int línia, int columna);
    bool document.isSpace(Cursor cursor);

  Retorna `true` (vertader), si el caràcter a la posició del cursor donada és un espai en blanc, en cas contrari retornarà `false` (fals).

    bool document.matchesAt(int línia, int columna, String text);
    bool document.matchesAt(Cursor cursor, String text);

  Retorna `true` (vertader), si el text donat coincideix a la posició del cursor corresponent, en cas contrari retornarà `false` (fals).

    bool document.startsWith(int línia, String text, bool skipWhiteSpaces);

  Retorna `true` (vertader), si la línia comença amb text, en cas contrari retornarà `false` (fals). L'argument skipWhiteSpaces controla si s'han d'ometre els espais en blanc al davant.

    bool document.endsWith(int línia, String text, bool skipWhiteSpaces);

  Retorna `true` (vertader), si la línia acaba amb text, en cas contrari retornarà `false` (fals). L'argument skipWhiteSpaces controla si s'han d'ometre els espais en blanc al darrere.

    bool document.setText(String text);

  Estableix el text a tot el document.

    bool document.clear();

  Esborra el text sencer en el document.

    bool document.truncate(int línia, int columna);
    bool document.truncate(Cursor cursor);

  Trunca la línia donada a la columna o la posició del cursor donada. Retorna `true` (vertader) en cas d'èxit, o `false` (fals) si la línia donada no forma part de l'interval document.

    bool document.insertText(int línia, int columna, String text);
    bool document.insertText(Cursor cursor, String text);

  Insereix el text en la posició donada del cursor. Retorna `true` (vertader) en cas d'èxit, o `false` (fals), si el document està en mode de només lectura.

    bool document.removeText(int desdeLínia, int desdeColumna, int alaLínia, int alaColumna);
    bool document.removeText(Cursor desde, Cursor a);
    bool document.removeText(Range rang);

  Elimina el text dins de l'interval donat. Retorna `true` (vertader) en cas d'èxit, o `false` (fals), si el document està en mode de només lectura.

    bool document.insertLine(int línia, String text);

  Insereix text en la línia donada. Retorna `true` (vertader) en cas d'èxit, o `false` (fals), si el document està en mode de només lectura o la línia no està a l'interval document.

    bool document.removeLine(int línia);

  Elimina la línia de text donada. Retorna `true` (vertader) en cas d'èxit, o `false` (fals), si el document està en mode de només lectura o la línia no està a l'interval document.

    bool document.wrapLine(int línia, int columna);
    bool document.wrapLine(Cursor cursor);

  Ajusta la línia en la posició del cursor donada. Retorna `true` (vertader) en cas d'èxit, o `false` (fals), &pex; si la línia < 0.

  Des de: KDE 4.9

    void document.joinLines(int iniciLínia, int finalLínia);

  S'uneix a les línies de iniciLínia a finalLínia. Dues línies de text successives sempre estan separades per un espai.

    int document.lines();

  Retorna la quantitat de línies en el document.

    int document.length();

  Retorna el nombre de caràcters en el document.

    int document.lineLength(int línia);

  Retorna la longitud de la línia.

    void document.editBegin();

  Comença un grup d'edició per agrupar desfer/refer. Assegureu-vos de cridar sempre `editEnd()` tan aviat com crideu `editBegin()`. La crida `editBegin()` utilitza internament un comptador de referència, &ead;, aquesta crida es pot niar.

    void document.editEnd();

  Finalitza un grup d'edició. L'última crida de `editEnd()` (&ead;, una per a la primera crida de `editBegin()`) finalitza la passa d'edició.

    int document.firstColumn(int línia);

  Retorna la primera columna que no està en blanc en la línia donada. Si només hi ha espais en blanc en la línia, el valor retornat serà `-1`.

    int document.lastColumn(int línia);

  Retorna la darrera columna que no està en blanc en la línia donada. Si només hi ha espais en blanc en la línia, el valor retornat serà `-1`.

    int document.prevNonSpaceColumn(int línia, int columna);
    int document.prevNonSpaceColumn(Cursor cursor);

  Retorna la columna no buida que conté caràcters no en blanc a partir de la posició donada del cursor i cercant cap enrere.

    int document.nextNonSpaceColumn(int línia, int columna);
    int document.nextNonSpaceColumn(Cursor cursor);

  Retorna la columna no buida que conté caràcters no en blanc a partir de la posició donada del cursor i cercant cap endavant.

    int document.prevNonEmptyLine(int línia);

  Retorna la línia següent no buida que conté caràcters no en blanc a la cerca cap enrere.

    int document.nextNonEmptyLine(int línia);

  Retorna la línia següent no buida que conté caràcters no en blanc a la cerca cap endavant.

    bool document.isInWord(String caràcter, int atribut);

  Retorna `true` (vertader), si el caràcter donat amb l'atribut donat pot formar part d'una paraula, en cas contrari retornarà `false` (fals).

    bool document.canBreakAt(String caràcter, int atribut);

  Retorna `true` (vertader), si el caràcter donat amb l'atribut donat és adequat com a embolcall d'una línia, en cas contrari retornarà `false` (fals).

    bool document.canComment(int iniciAtribut, int finalAtribut);

  Retorna `true` (vertader), si un interval inicial i final amb els atributs donats es presten a ser descomentats, en cas contrari retornarà `false` (fals).

    String document.commentMarker(int atribut);

  Retorna el marcador de comentari per als comentaris de línia única per a un atribut donat.

    String document.commentStart(int atribut);

  Retorna el marcador de comentari per al començament de comentaris de múltiples línies per a un atribut donat.

    String document.commentEnd(int atribut);

  Retorna el marcador de comentari per al final de comentaris de múltiples línies per a un atribut donat.

    int document.attribute(int línia, int columna);
    int document.attribute(Cursor cursor);

  Retorna l'atribut a la posició del cursor donada.

    bool document.isAttribute(int línia, int columna, int atribut);
    bool document.isAttribute(Cursor cursor, int atribut);

  Retorna `true` (vertader), si l'atribut a la posició del cursor és igual que l'atribut, en cas contrari retornarà `false` (fals).

    String document.attributeName(int línia, int columna);
    String document.attributeName(Cursor cursor);

  Retorna el nom de l'atribut com a text llegible. Això equival al nom `itemData` en els fitxers de ressaltat de sintaxi.

    bool document.isAttributeName(int línia, int columna, String nom);
    bool document.isAttributeName(Cursor cursor, String nom);

  Retorna `true` (vertader), si el nom de l'atribut en una posició determinada del cursor coincideix amb el nom donat, en cas contrari retornarà `false` (fals).

    String document.variable(String clau);

  Retorna el valor de la variable de document demanada clau. Si la variable de document no existeix, el valor retornat serà una cadena buida.

    String document.setVariable(String clau, String valor);

  Estableix el valor de la variable de document demanada clau. Retorna el valor de la variable establerta.

  Veure també: variables de document de Kate

  Des de: KDE 4.8

    int document.firstVirtualColumn(int línia);

  Retorna la columna virtual del primer caràcter que no està en blanc en la línia donada o `-1`, si la línia està buida o només conté caràcters d'espai en blanc.

    int document.lastVirtualColumn(int línia);

  Retorna la columna virtual de l'últim caràcter que no està en blanc en la línia donada o `-1`, si la línia està buida o només conté caràcters d'espai en blanc.

    int document.toVirtualColumn(int línia, int columna);
    int document.toVirtualColumn(Cursor cursor);
    Cursor document.toVirtualCursor(Cursor cursor);

  Converteix la posició «real» donada del cursor a una posició virtual del cursor, d'altra manera retorna un int o un objecte Cursor.

    int document.fromVirtualColumn(int línia, int virtualColumna);
    int document.fromVirtualColumn(Cursor virtualCursor);
    Cursor document.fromVirtualCursor(Cursor virtualCursor);

  Converteix la posició virtual donada del cursor a una posició «real» del cursor, d'altra manera retorna un int o un objecte Cursor.

    Cursor document.anchor(int línia, int columna, Char caràcter);
    Cursor document.anchor(Cursor cursor, Char caràcter);

  Cerca enrere pel caràcter donat a partir del cursor donat. Com exemple, si es passa «(» com a caràcter, aquesta funció retornarà la posició de l'obertura «(». Això compta la referència, &ead;, els altres «(...)» seran ignorats.

    Cursor document.rfind(int línia, int columna, String text, int atribut = -1);
    Cursor document.rfind(Cursor cursor, String text, int atribut = -1);

  Cercar cap enrere el text donat amb l'atribut adequat. L'argument atribut s'ignorarà si s'estableix a `-1`. El cursor retornat no serà vàlid, si el text no s'ha pogut trobar.

    int document.defStyleNum(int línia, int columna);
    int document.defStyleNum(Cursor cursor);

  Retorna l'estil per omissió utilitzat a la posició donada del cursor.

    bool document.isCode(int línia, int columna);
    bool document.isCode(Cursor cursor);

  Retorna `true` (vertader), si l'atribut a la posició donada del cursor no és igual per a tots els següents estils: `dsComment`, `dsString`, `dsRegionMarker`, `dsChar`, `dsOthers`.

    bool document.isComment(int línia, int columna);
    bool document.isComment(Cursor cursor);

  Retorna `true` (vertader), si l'atribut del caràcter a la posició del cursor és `dsComment`, en cas contrari retornarà `false` (fals).

    bool document.isString(int línia, int columna);
    bool document.isString(Cursor cursor);

  Retorna `true` (vertader), si l'atribut del caràcter a la posició del cursor és `dsString`, en cas contrari retornarà `false` (fals).

    bool document.isRegionMarker(int línia, int columna);
    bool document.isRegionMarker(Cursor cursor);

  Retorna `true` (vertader), si l'atribut del caràcter a la posició del cursor és `dsRegionMarker`, en cas contrari retornarà `false` (fals).

    bool document.isChar(int línia, int columna);
    bool document.isChar(Cursor cursor);

  Retorna `true` (vertader), si l'atribut del caràcter a la posició del cursor és `dsChar`, en cas contrari retornarà `false` (fals).

    bool document.isOthers(int línia, int columna);
    bool document.isOthers(Cursor cursor);

  Retorna `true` (vertader), si l'atribut del caràcter a la posició del cursor és `dsOthers`, en cas contrari retornarà `false` (fals).

## Extensions del component d'edició

Les extensions per al component d'edició estenen la KatePart, el component de l'editor de text avançat és utilitzat en moltes aplicacions del &kde;, com &kate;, &kwrite;, Kile i KDevelop. La creació d'un connector per al component d'edició us permetrà estendre la funcionalitat de l'editor a tots i cadascun d'aquests programes.

Per començar, veure la guia d'aprenentatge per a connectors de KTextEditor al TechBase del &kde;. Per més, veure la guia d'aprenentatge avançada, també en a TechBase.

Podeu trobar la documentació de la API a la referència de la API del &kde;.

## Connectors (C++) de l'aplicació &kate;

Els connectors de l'aplicació &kate; estenen la funcionalitat del propi editor &kate; de cap manera com us pugueu imaginar, utilitzant el mateix llenguatge de programació en que està escrit &kate;, C++.

Per començar, veure la guia d'aprenentatge «Escriure un connector pel &kate;» al lloc web del &kate;. També hi ha un connector clàssic d'exemple Hello, world! inclòs amb el codi font de &kate;.

## Connectors en Python de &pate;

Els connectors de &pate; també us permeten ampliar la funcionalitat del &kate;, en qualsevol manera com vulgueu, utilitzant el llenguatge de programació Python.

Per començar, veure la guia del desenvolupador de connectors amb Python al lloc web de &kate;.

També podeu accedir a la referència de la API a la pantalla de configuració de &pate;.