// SPDX-FileCopyrightText: 2003-2026 Sébastien Helleu <flashcode@flashtux.org>
// SPDX-FileCopyrightText: 2021-2025 Иван Пешић <ivan.pesic@gmail.com>
//
// SPDX-License-Identifier: GPL-3.0-or-later

= WeeChat водич за програмере
:author: Sébastien Helleu
:email: flashcode@flashtux.org
:lang: sr
include::includes/attributes-sr.adoc[]

Ово упутство описује WeeChat чет клијент и део је програма WeeChat.

Последња верзија овог документа може да се пронађе на
https://weechat.org/doc/[овој страници ^↗^^].

[[introduction]]
== Увод

WeeChat (Wee Enhanced Environment for Chat) је бесплатни чет клијент, једноставан и брз, дизајниран за многе оперативне системе.

Ово упутство описује интерно функционисање програма WeeChat:

* репозиторијуми
* правила за писање кода
* интерне ствари језгра
* интерне ствари додатака
* како дати допринос програму WeeChat.

[[repositories]]
== Репозиторијуми

WeeChat репозиторијуми се налазе на GitHub организацији
https://github.com/weechat[weechat ^↗^^].

Листа репозиторијума:

weechat::
    репозиторијум језгра са изворним кодом и документацијом

scripts::
    _званичне_ скрипте које су предате на weechat.org

weechat.org::
    изворни кôд https://weechat.org/[WeeChat вебсајта ^↗^^]

weercd::
    IRC сервер за тестирање

qweechat::
    Qt даљински ГКИ за WeeChat.

Ово упутство документује само _weechat_ репозиторијум.

[[overview]]
=== Преглед

Ово су главни WeeChat директоријуми:

[width="100%", cols="2m,3", options="header"]
|===
| Директоријум       | Опис
| src/               | Корен извора.
|    core/           | Функције језгра: улазна тачка, интерне структуре.
|       hook/        | Функције кука.
|    gui/            | Функције за бафере, прозоре, ... (користе их сви интерфејси).
|       curses/      | Curses интерфејс.
|          headless/ | Режим без интерфејса.
|          normal/   | Curses интерфејс.
|    plugins/        | API за додатке и скриптовање.
|       alias/       | Alias додатак.
|       buflist/     | Buflist додатак.
|       charset/     | Charset додатак.
|       exec/        | Exec додатак.
|       fifo/        | Fifo додатак (FIFO пајп се користи за удаљено слање команди програму WeeChat).
|       fset/        | Fset (Fast Set) додатак.
|       guile/       | API за Guile (scheme) скриптовање.
|       irc/         | IRC (Internet Relay Chat) додатак.
|       javascript/  | API за JavaScript скриптовање.
|       logger/      | Logger додатак (уписивање порука које се приказују у фајл).
|       lua/         | API за Lua скриптовање.
|       perl/        | API за Perl скриптовање.
|       php/         | API за PHP скриптовање.
|       python/      | API за Python скриптовање.
|       relay/       | Relay plugin (irc прокси + релеј за удаљене интерфејсе).
|       ruby/        | API за Ruby скриптовање.
|       script/      | Скрипт менаџер.
|       spell/       | Spell додатак.
|       tcl/         | API за Tcl скриптовање.
|       trigger/     | Trigger додатак.
|       typing/      | Typing додатак.
|       xfer/        | Xfer додатак (IRC DCC фајл/разговор).
| tests/             | Тестови.
|    fuzz/           | Fuzz тестирање.
|       core/        | Fuzz тестирање функција језгра.
|    unit/           | Unit тестови.
|       core/        | Unit тестови за функције језгра.
|          hook/     | Unit тестову за функције куке.
|       gui/         | Unit тестови за функције интерфејса.
|          curses/   | Unit тестови за функције Curses интерфејса.
|       scripts/     | Тестови за API скриптовања.
|          python/   | Python скрипте за генерисање и покретање тестова за API скриптовања.
|       plugins/     | Unit тестови за додатке.
|          alias/    | Unit тестови за alias додатак.
|          irc/      | Unit тестови за IRC додатак.
|          logger/   | Unit тестови за logger додатак.
|          relay/    | Unit тестови за relay додатак.
|          trigger/  | Unit тестови за trigger додатак.
|          typing/   | Unit тестови за typing додатак.
|          xfer/     | Unit тестови за xfer додатак.
| doc/               | Документација.
| po/                | Фајлови превода (gettext).
| debian/            | Debian паковање.
|===

[[sources]]
=== Извори

[[sources_core]]
==== Језгро

WeeChat „језгро” се налази у следећим директоријумима:

* _src/core/_: функције језгра (за манипулацију подацима)
* _src/gui/_: функције у вези интерфејса (бафери, прозори, ...)

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл                   | Опис
| core/                         | Функције језгра: тачка улаза, интерне структуре.
|    core-args.c                | Аргументи командне-линије.
|    core-arraylist.c           | Листе низова.
|    core-backtrace.c           | Испис трага након краха.
|    core-calc.c                | Израчунавање резултата израза.
|    core-command.c             | WeeChat команде језгра.
|    core-completion.c          | Подразумевана довршавања.
|    core-config-file.c         | Управљање конфигурационим фајловима.
|    core-config.c              | Конфигурационе опције за WeeChat језгро (фајл weechat.conf).
|    core-crypto.c              | Криптографске функције.
|    core-debug.c               | Неке дибаг функције.
|    core-dir.c                 | Функције директоријума/фајла.
|    core-doc.c                 | Изградња фајлова за документацију.
|    core-eval.c                | Израчунавање израза са референцама на интерне променљиве.
|    core-hashtable.c           | Хеш табеле.
|    core-hdata.c               | Hdata (директни приступ подацима употребом хеш табела).
|    core-hook.c                | Куке.
|    core-infolist.c            | Инфолисте (листе са подацима објеката).
|    core-input.c               | Унос команди/текста.
|    core-list.c                | Сортиране листе.
|    core-log.c                 | Упис у WeeChat лог фајл (weechat.log).
|    core-network.c             | Мрежне функције (повезивање са серверима/проксијима).
|    core-proxy.c               | Управљање проксијима.
|    core-secure.c              | Функције обезбеђених података.
|    core-secure-buffer.c       | Бафер обезбеђених података.
|    core-secure-config.c       | Опције обезбеђених података (фајл sec.conf).
|    core-string.c              | Функције над стринговима.
|    core-sys.c                 | Системске функције.
|    core-upgrade-file.c        | Интерни систем ажурирања.
|    core-upgrade.c             | Ажурирање за WeeChat језгро (бафери, линије, историја, ...).
|    core-url.c                 | URL трансфер (помоћу libcurl).
|    core-utf8.c                | UTF-8 функције.
|    core-util.c                | Неке друге функције.
|    core-version.c             | Функције за WeeChat верзију.
|    weechat.c                  | Основне функције: опције командне линије, покретање.
|    hook/                      | Функције кука.
|       hook-command-run.c      | Кука "command_run".
|       hook-command.c          | Кука "command".
|       hook-completion.c       | Кука "completion".
|       hook-config.c           | Кука "config".
|       hook-connect.c          | Кука "connect".
|       hook-fd.c               | Кука "fd".
|       hook-focus.c            | Кука "focus".
|       hook-hdata.c            | Кука "hdata".
|       hook-hsignal.c          | Кука "hsignal".
|       hook-info-hashtable.c   | Кука "info_hashtable".
|       hook-info.c             | Кука "info".
|       hook-infolist.c         | Кука "infolist".
|       hook-line.c             | Кука "line".
|       hook-modifier.c         | Кука "modifier".
|       hook-print.c            | Кука "print".
|       hook-process.c          | Кука "process".
|       hook-signal.c           | Кука "signal".
|       hook-timer.c            | Кука "timer".
|       hook-url.c              | Кука "url".
| gui/                          | Функције за бафере, прозоре, ... (користе их сви интерфејси).
|    gui-bar-item.c             | Ставке трака.
|    gui-bar-window.c           | Прозори трака.
|    gui-bar.c                  | Траке.
|    gui-buffer.c               | Бафери.
|    gui-chat.c                 | Функције разговора (призаз поруке, ...).
|    gui-color.c                | Функције боја.
|    gui-completion.c           | Довршавање у командној линији.
|    gui-cursor.c               | Курсорски режим (слободно померање курсора).
|    gui-filter.c               | Филтери.
|    gui-focus.c                | Функције у вези фокуса (за курсорски режими миша).
|    gui-history.c              | Команде/текст сачуван у баферима.
|    gui-hotlist.c              | Управљање врућом листом (листа бафера у којима има активности).
|    gui-input.c                | Функције уноса (трака уноса).
|    gui-key.c                  | Функције тастатуре.
|    gui-layout.c               | Распоред.
|    gui-line.c                 | Линије у баферу.
|    gui-mouse.c                | Миш.
|    gui-nick.c                 | Функције надимака.
|    gui-nicklist.c             | Листа надимака у баферима.
|    gui-window.c               | Прозори.
|    curses/                    | Curses интерфејс.
|       gui-curses-bar-window.c | Приказ у прозорима трака.
|       gui-curses-chat.c       | Приказ у простору разговора (поруке).
|       gui-curses-color.c      | Функције боја.
|       gui-curses-key.c        | Функције тастатуре (подраз. тастери, читање уноса).
|       gui-curses-main.c       | WeeChat главна петља (чекање на догађаје тастатуре/мреже).
|       gui-curses-mouse.c      | Миш.
|       gui-curses-term.c       | Функције у вези терминала.
|       gui-curses-window.c     | Прозори.
|       headless/               | Режим без интерфејса.
|          main.c               | Тачка улаза за режим без интерфејса.
|          ncurses-fake.c       | Лажна ncurses библиотека.
|       normal/                 | Curses интерфејс.
|          main.c               | Тачка улаза за Curses интерфејс.
|===

[[sources_plugins]]
==== Додаци

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл                        | Опис
| plugins/                           | Корен додатака.
|    plugin.c                        | Управљање додацима (учитавање/уклањање динамичких C библиотека).
|    plugin-api.c                    | Додатне функције за API додатака (омотач око WeeChat функција језгра).
|    plugin-api-info.c               | Додатне info/infolist функције за API додатака.
|    plugin-config.c                 | Опције конфигурације додатака (фајл plugins.conf).
|    plugin-script.c                 | Опште функције које користе скрипт додаци.
|    plugin-script-api.c             | Скрипт API функције: омотачи око неких функција API додатака.
|    plugin-script-config.c          | Опције конфигурације скрипт додатака (фајлови python.conf, perl.conf, ...).
|    weechat-plugin.h                | Заглавље које треба да се дистрибуира уз WeeChat додатке, како би могли да се компајлирају.
|    alias/                          | Alias додатак.
|       alias.c                      | Главне алијас функције.
|       alias-command.c              | Алијас команде.
|       alias-completion.c           | Алијас довршавање.
|       alias-config.c               | Алијас опције конфигурације (фајл alias.conf).
|       alias-info.c                 | Алијас info/infolists/hdata.
|    spell/                          | Додатак за проверу правописа.
|       spell.c                      | Главне функције провере правописа.
|       spell-bar-item.c             | Провера правописа ставке траке.
|       spell-command.c              | Провера правописа команде.
|       spell-completion.c           | Провера правописа довршавања.
|       spell-config.c               | Провера правописа опције конфиг (фајл spell.conf).
|       spell-info.c                 | Провера правописа info/infolists/hdata.
|       spell-speller.c              | Управљање библиотекама за проверу правописа.
|    buflist/                        | Buflist додатак.
|       buflist.c                    | Главне buflist функције.
|       buflist-bar-item.c           | Buflist ставке траке.
|       buflist-command.c            | Buflist команде.
|       buflist-completion.c         | Buflist довршавања.
|       buflist-config.c             | Buflist опције конфиг (фајл buflist.conf).
|       buflist-info.c               | Buflist info/infolists/hdata.
|       buflist-mouse.c              | Buflist акције мишем.
|    charset/                        | Charset додатак.
|       charset.c                    | Charset функције.
|    exec/                           | Exec додатак.
|       exec.c                       | Главне exec функције.
|       exec-buffer.c                | Exec бафер.
|       exec-command.c               | Exec команде.
|       exec-completion.c            | Exec довршавања.
|       exec-config.c                | Exec опције конфиг (фајл exec.conf).
|    fifo/                           | Fifo додатак.
|       fifo.c                       | Главне fifo функције.
|       fifo-command.c               | Fifo команде.
|       fifo-config.c                | Fifo опције конфиг (фајл fifo.conf).
|       fifo-info.c                  | Fifo info/infolists/hdata.
|    fset/                           | Fset додатак.
|       fset.c                       | Главне fset функције.
|       fset-bar-item.c              | Fset ставке траке.
|       fset-buffer.c                | Fset бафер.
|       fset-command.c               | Fset команде.
|       fset-completion.c            | Fset довршавања.
|       fset-config.c                | Fset опције конфиг (фајл fset.conf).
|       fset-info.c                  | Fset info/infolists/hdata.
|       fset-mouse.c                 | Fset акције мишем.
|       fset-option.c                | Fset управљање опцијама.
|    guile/                          | Guile (scheme) додатак.
|       weechat-guile.c              | Главне guile функције (учитавање/уклањање скрипти, извршавање guile кода).
|       weechat-guile-api.c          | API функције guile скриптовања.
|    irc/                            | IRC (Internet Relay Chat) додатак.
|       irc.c                        | Основне IRC функције.
|       irc-bar-item.c               | IRC ставке траке.
|       irc-batch.c                  | IRC пакетни догађаји.
|       irc-buffer.c                 | IRC бафери.
|       irc-channel.c                | IRC канали.
|       irc-color.c                  | IRC боје.
|       irc-command.c                | IRC команде.
|       irc-completion.c             | IRC довршавања.
|       irc-config.c                 | IRC опције конфиг (фајл irc.conf).
|       irc-ctcp.c                   | IRC CTCP.
|       irc-debug.c                  | IRC дибаг функције.
|       irc-ignore.c                 | IRC Ignore.
|       irc-info.c                   | IRC info/infolists/hdata.
|       irc-input.c                  | Унос команди/текста.
|       irc-join.c                   | Функције за листе канала којима се приступа.
|       irc-list.c                   | Бафер за одговор на /list команду.
|       irc-message.c                | Функције за манипулисање IRC порукама.
|       irc-mode.c                   | Функције у вези режима канала/надимка.
|       irc-modelist.c               | Листе режима IRC канала (+b, +e, +I, ...).
|       irc-msgbuffer.c              | Циљни бафер за IRC поруке.
|       irc-nick.c                   | IRC надимци.
|       irc-notify.c                 | IRC листе за обавештавање.
|       irc-protocol.c               | IRC протокол (RFCs 1459/2810/2811/2812/2813/7194).
|       irc-raw.c                    | IRC сирови бафер.
|       irc-redirect.c               | Преусмеравање излаза IRC команде.
|       irc-sasl.c                   | SASL аутентификација са IRC сервером.
|       irc-server.c                 | У/И комуникација са IRC сервером.
|       irc-tag.c                    | Функције за манипулацију ознакама IRC порука.
|       irc-typing.c                 | Статус куцања.
|       irc-upgrade.c                | Чување/обнављање IRC података када се ажурира програм WeeChat.
|    javascript/                     | JavaScript додатак.
|       weechat-js.cpp               | Главне JavaScript функције (учитавање/уклањање скрипти, извршавање JavaScript кода).
|       weechat-js-api.cpp           | API функције JavaScript скриптовања.
|       weechat-js-v8.cpp            | JavaScript v8 функције.
|    logger/                         | Logger додатак.
|       logger.c                     | Главне logger функције.
|       logger-backlog.c             | Logger backlog функције.
|       logger-buffer.c              | Logger управљање листом бафера.
|       logger-command.c             | Logger команде.
|       logger-config.c              | Logger опције конфиг (фајл logger.conf).
|       logger-info.c                | Logger info/infolists/hdata.
|       logger-tail.c                | Функције за враћање последњих линија фајла.
|    lua/                            | Lua додатак.
|       weechat-lua.c                | Главне lua функције (учитавање/уклањање скрипти, извршавање lua кода).
|       weechat-lua-api.c            | API функције Lua скриптовања.
|    perl/                           | Perl додатак.
|       weechat-perl.c               | Главне perl функције (учитавање/уклањање скрипти, извршавање perl кода).
|       weechat-perl-api.c           | API функције Perl скриптовања.
|    php/                            | PHP додатак.
|       weechat-php.c                | Главне PHP функције (учитавање/уклањање скрипти, извршавање PHP кода).
|       weechat-php-api.c            | API функције PHP скриптовања.
|    python/                         | Python додатак.
|       weechat-python.c             | Главне python функције (учитавање/уклањање скрипти,извршавање python кода).
|       weechat-python-api.c         | API функције Python скриптовања.
|    relay/                          | Релеј додатак (IRC прокси и релеј за удаљене интерфејсе).
|       relay.c                      | Главне релеј функције.
|       relay-auth.c                 | Аутентификација клијената.
|       relay-bar-item.c             | Ставке траке Релеја.
|       relay-buffer.c               | Релеј бафер.
|       relay-client.c               | Клијенти релеја.
|       relay-command.c              | Релеј команде.
|       relay-completion.c           | Релеј довршавања.
|       relay-config.c               | Релеј опције конфиг (фајл relay.conf).
|       relay-http.c                 | HTTP функције.
|       relay-info.c                 | Релеј info/infolists/hdata.
|       relay-network.c              | Мрежне функције за релеј.
|       relay-raw.c                  | Релеј сирови бафер.
|       relay-remote.c               | Релеј удаљених.
|       relay-server.c               | Релеј сервер.
|       relay-upgrade.c              | Чување/обнављање података релеја када се ажурира WeeChat.
|       relay-websocket.c            | WebSocket сервер функције (RFC 6455).
|       api/                         | Релеј за удаљене интерфејсе (користећи HTTP REST API).
|          relay-api.c               | Главне API функције за HTTP REST API.
|          relay-api-msg.c           | Слање JSON порука клијентима.
|          relay-api-protocol.c      | HTTP REST API протокол.
|          remote/                   | Функције прослеђивања удаљених, специфичне за API.
|             relay-remote-event.c   | Обрада догађаја који се приме од релеја удаљених.
|             relay-remote-network.c | Мрежне функције за релеј удаљених.
|       irc/                         | IRC прокси.
|          relay-irc.c               | Главне IRC прокси функције.
|       weechat/                     | Релеј за удаљене интерфејсе (користећи „weechat” бинарни протокол).
|          relay-weechat.c           | Релеј за удаљене интерфејсе (главне функције).
|          relay-weechat-msg.c       | Слање бинарних порука клијентима.
|          relay-weechat-nicklist.c  | Функције листе надимака.
|          relay-weechat-protocol.c  | Читање команди од клијената.
|    ruby/                           | Ruby додатак.
|       weechat-ruby.c               | Главне ruby функције (учитавање/уклањање скрипти, извршавање ruby кода).
|       weechat-ruby-api.c           | API функције Ruby скриптовања.
|    script/                         | Управљач скриптама.
|       script.c                     | Главне функције за управљача скриптама.
|       script-action.c              | Акције над скриптама (учитавање/уклањање, инсталација/деинсталација, ...).
|       script-buffer.c              | Бафер за управљача скриптама.
|       script-command.c             | Команде за управљача скриптама.
|       script-completion.c          | Довршавања за управљача скриптама.
|       script-config.c              | Опције конфигурације за управљача скриптама (фајл script.conf).
|       script-info.c                | Управљач скриптама info/infolists/hdata.
|       script-mouse.c               | Скрипт акције мишем.
|       script-repo.c                | Преузимање и читање фајла репозиторијума.
|    tcl/                            | Tcl додатак.
|       weechat-tcl.c                | Главне tcl функције (учитавање/уклањање скрипти, извршавање tcl кода).
|       weechat-tcl-api.c            | API функције Tcl скриптовања.
|    trigger/                        | Окидач додатак.
|       trigger.c                    | Главне функције окидача.
|       trigger-buffer.c             | Окидач бафер.
|       trigger-callback.c           | Окидач функције повратног позива.
|       trigger-command.c            | Окидач команде.
|       trigger-completion.c         | Окидач довршавања.
|       trigger-config.c             | Окидач опције конфиг (фајл trigger.conf).
|    typing/                         | Typing додатак.
|       typing.c                     | Главне typing функције.
|       typing-bar-item.c            | Typing ставке траке.
|       typing-config.c              | Typing конфигурационе опције (фајл typing.conf).
|       typing-status.c              | Статус куцања порука на баферима.
|    xfer/                           | Xfer додатак (IRC DCC фајл/разговор).
|       xfer.c                       | Главне xfer функције.
|       xfer-buffer.c                | Xfer бафер.
|       xfer-chat.c                  | DCC разговор.
|       xfer-command.c               | Xfer команде.
|       xfer-completion.c            | Xfer довршавања.
|       xfer-config.c                | Xfer опције конфиг (фајлxfer.conf).
|       xfer-dcc.c                   | DCC пренос фајла.
|       xfer-file.c                  | Фајл функције за xfer.
|       xfer-info.c                  | Xfer info/infolists/hdata.
|       xfer-network.c               | Мрежне функције за xfer.
|       xfer-upgrade.c               | Чување/обнављање xfer података када се програм WeeChat ажурира.
|===

[[sources_tests]]
==== Тестови

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл                                     | Опис
| tests/                                          | Корен тестова.
|    fuzz/                                        | Корен fuzz тестирања.
|       ossfuzz.sh                                | Скрипта изградње за https://github.com/google/oss-fuzz[OSS-Fuzz ^↗^^].
|       core/                                     | Корен fuzz тестирања за језгро.
|          calc-fuzzer.c                          | Fuzz тестирање: калкулација израза.
|          crypto-fuzzer.c                        | Fuzz тестирање: криптографске функције.
|          secure-fuzzer.c                        | Fuzz тестирање: обезбеђени подаци.
|          string-fuzzer.c                        | Fuzz тестирање: стрингови.
|          utf8-fuzzer.c                          | Fuzz тестирање: UTF-8.
|          util-fuzzer.c                          | Fuzz тестирање: услужне функције.
|    unit/                                        | Корен unit тестова.
|       tests.cpp                                 | Програм који се користи за извршавање свих тестова.
|       tests-record.cpp                          | Бележење и претрага у приказаним порукама.
|       core/                                     | Корен unit тестова језгра.
|          test-core-arraylist.cpp                | Тестови: arraylists.
|          test-core-calc.cpp                     | Тестови: калкулација израза.
|          test-core-command.cpp                  | Тестови: команде.
|          test-core-config-file.cpp              | Тестови: конфигурациони фајлови.
|          test-core-crypto.cpp                   | Тестови: криптографске функције.
|          test-core-dir.cpp                      | Тестови: функције директоријума/фајла.
|          test-core-eval.cpp                     | Тестови: израчунавање израза.
|          test-core-hashtable.cpp                | Тестови: hashtables.
|          test-core-hdata.cpp                    | Тестови: hdata.
|          test-core-hook.cpp                     | Тестови: куке.
|          test-core-infolist.cpp                 | Тестови: infolists.
|          test-core-input.cpp                    | Тестови: функције за унос.
|          test-core-list.cpp                     | Тестови: листе.
|          test-core-network.cpp                  | Тестови: мрежне функције.
|          test-core-secure.cpp                   | Тестови: обезбеђени подаци.
|          test-core-signal.cpp                   | Тестови: сигнали.
|          test-core-string.cpp                   | Тестови: стрингови.
|          test-core-sys.cpp                      | Тестови: системске функције.
|          test-core-url.cpp                      | Тестови: URL адресе.
|          test-core-utf8.cpp                     | Тестови: UTF-8.
|          test-core-util.cpp                     | Тестови: помоћне функције.
|          hook/                                  | Корен unit тестова за куке.
|             test-hook-command.cpp               | Тестови: куке „command”.
|             test-hook-command-run.cpp           | Тестови: куке „command_run”.
|             test-hook-completion.cpp            | Тестови: куке „completion”.
|             test-hook-config.cpp                | Тестови: куке „config”.
|             test-hook-connect.cpp               | Тестови: куке „connect”.
|             test-hook-fd.cpp                    | Тестови: куке „fd”.
|             test-hook-focus.cpp                 | Тестови: куке „focus”.
|             test-hook-hdata.cpp                 | Тестови: куке „hdata”.
|             test-hook-hsignal.cpp               | Тестови: куке „hsignal”.
|             test-hook-info-hashtable.cpp        | Тестови: куке „info_hashtable”.
|             test-hook-info.cpp                  | Тестови: куке „info”.
|             test-hook-infolist.cpp              | Тестови: куке „infolist”.
|             test-hook-line.cpp                  | Тестови: куке „line”.
|             test-hook-modifier.cpp              | Тестови: куке „modifier”.
|             test-hook-print.cpp                 | Тестови: куке „print”.
|             test-hook-process.cpp               | Тестови: куке „process”.
|             test-hook-signal.cpp                | Тестови: куке „signal”.
|             test-hook-timer.cpp                 | Тестови: куке „timer”.
|             test-hook-url.cpp                   | Тестови: куке „url”.
|       gui/                                      | Корен unit тестова интерфејса.
|          test-gui-bar-item-custom.cpp           | Тестови: функције ставки прилагођене траке.
|          test-gui-bar-item.cpp                  | Тестови: функције ставки траке.
|          test-gui-bar-window.cpp                | Тестови: функције прозора траке.
|          test-gui-bar.cpp                       | Тестови: функције траке.
|          test-gui-buffer.cpp                    | Тестови: бафер функције.
|          test-gui-chat.cpp                      | Тестови: чет функције.
|          test-gui-color.cpp                     | Тестови: боје.
|          test-gui-filter.cpp                    | Тестови: филтери.
|          test-gui-hotlist.cpp                   | Тестови: функције врућих листи.
|          test-gui-input.cpp                     | Тестови: улазне функције.
|          test-gui-key.cpp                       | Тестови: тастери.
|          test-gui-line.cpp                      | Тестови: линије.
|          test-gui-nick.cpp                      | Тестови: надимци.
|          test-gui-nicklist.cpp                  | Тестови: функције листе надимака.
|          curses/                                | Корен unit тестова за Curses интерфејс.
|             test-gui-curses-mouse.cpp           | Тестови: миш (Curses интерфејс).
|       scripts/                                  | Корен тестова за API скриптовања.
|          test-scripts.cpp                       | Програм који се користи за извршавање тестова API скриптовања.
|          python/                                | Python скрипте које генеришу и покрећу тестове API скриптовања.
|             testapigen.py                       | Python скрипта која генерише скрипте на свим језицима за тестирање API скриптовања.
|             testapi.py                          | Python скрипта са тестовима API скриптовања, користи је скрипта testapigen.py.
|             unparse.py                          | Конверзија Python кода у остале језике, користи је скрипта testapigen.py.
|       plugins/                                  | Корен unit тестова додатака.
|          test-plugin-config.cpp                 | Тестови: функције конфигурације додатка.
|          test-plugin-api-info.cpp               | Тестови: инфо функције API додатака.
|          test-plugins.cpp                       | Тестови: plugins.
|          alias/                                 | Корен unit тестова за alias додатак.
|             test-alias.cpp                      | Тестови: алијаси.
|          irc/                                   | Корен unit тестова IRC додатка.
|             test-irc-batch.cpp                  | Тестови: IRC пакетни догађаји.
|             test-irc-buffer.cpp                 | Тестови: IRC бафери.
|             test-irc-channel.cpp                | Тестови: IRC канали.
|             test-irc-color.cpp                  | Тестови: IRC боје.
|             test-irc-command.cpp                | Тестови: IRC команде.
|             test-irc-config.cpp                 | Тестови: IRC конфигурација.
|             test-irc-ctcp.cpp                   | Тестови: IRC CTCP.
|             test-irc-ignore.cpp                 | Тестови: IRC игнорисања.
|             test-irc-info.cpp                   | Тестови: IRC информације.
|             test-irc-join.cpp                   | Тестови: IRC функције приступања.
|             test-irc-list.cpp                   | Тестови: IRC бафер за одговор на /list команду.
|             test-irc-message.cpp                | Тестови: IRC поруке.
|             test-irc-mode.cpp                   | Тестови: IRC режими.
|             test-irc-nick.cpp                   | Тестови: IRC надимци.
|             test-irc-protocol.cpp               | Тестови: IRC протокол.
|             test-irc-sasl.cpp                   | Тестови: SASL аутентификација са IRC протоколом.
|             test-irc-server.cpp                 | Тестови: IRC сервер.
|             test-irc-tag.cpp                    | Тестови: IRC ознаке порука.
|          logger/                                | Корен unit тестова за logger додатак.
|             test-logger.cpp                     | Тестови: logger.
|             test-logger-backlog.cpp             | Тестови: logger заостатак.
|             test-logger-tail.cpp                | Тестови: logger tail функције.
|          relay/                                 | Корен unit тестова за Релеј додатак.
|             test-relay-auth.cpp                 | Тестови: аутентификација клијената.
|             test-relay-http.cpp                 | Тестови: HTTP функције за Релеј додатак.
|             test-relay-raw.cpp                  | Тестови: функције сирових порука за Релеј додатак.
|             test-relay-remote.cpp               | Тестови: удаљене функције за Релеј додатак.
|             test-relay-websocket.cpp            | Тестови: websocket функције за Релеј додатак.
|             api/                                | Корен unit тестова за Релеј „api” протокол.
|                test-relay-api.cpp               | Тестови: Релеј „api” протокол: опште функције.
|                test-relay-api-msg.cpp           | Тестови: Релеј „api” протокол: поруке.
|                test-relay-api-protocol.cpp      | Тестови: Релеј „api” протокол: протокол.
|                remote/                          | Тестови: Релеј „api” протокол: удаљене функције.
|                   test-relay-remote-event.cpp   | Тестови: Релеј „api” протокол: удаљени догађаји.
|                   test-relay-remote-network.cpp | Тестови: Релеј „api” протокол: удаљена мрежа.
|             irc/                                | Корен unit тестова за Релеј „irc” протокол.
|                test-relay-irc.cpp               | Тестови: Релеј „irc” протокол.
|          trigger/                               | Корен unit тестова за окидач додатак.
|             test-trigger.cpp                    | Тестови: окидачи.
|             test-trigger-config.cpp             | Тестови: конфигурација окидача.
|          typing/                                | Корен unit тестова за typing додатак.
|             test-typing.cpp                     | Тестови: typing.
|             test-typing-status.cpp              | Тестови: typing статус.
|          xfer/                                  | Корен unit тестова за Xfer додатак.
|             test-xfer-file.cpp                  | Тестови: фајл функције.
|             test-xfer-network.cpp               | Тестови: мрежне функције.
|===

[[documentation_translations]]
=== Документација / преводи

Фајлови документације:

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл                                   | Опис
| doc/                                          | Документација.
|    docinfo.html                               | Asciidoctor стил.
|    XX/                                        | Документација за језик XX (језици: en, fr, de, it, ...).
|       weechat.1.XX.adoc                       | Man страница(`man weechat`).
|       weechat_dev.XX.adoc                     | link:weechat_dev.sr.html[Водич за програмере ^↗^^] (овај документ).
|       weechat_faq.XX.adoc                     | link:weechat_faq.sr.html[ЧПП ^↗^^].
|       weechat_plugin_api.XX.adoc              | link:weechat_plugin_api.sr.html[Референца за API додатака ^↗^^].
|       weechat_quickstart.XX.adoc              | link:weechat_quickstart.sr.html[Водич за брзи почетак ^↗^^].
|       weechat_relay_api.XX.adoc               | Релеј „api” протокол (за удаљене интерфејсе).
|       weechat_relay_weechat.XX.adoc           | link:weechat_relay_weechat.sr.html[Релеј „weechat” протокол ^↗^^] (за удаљене интерфејсе).
|       weechat_scripting.XX.adoc               | link:weechat_scripting.sr.html[Водич за скриптовање ^↗^^].
|       weechat_user.XX.adoc                    | link:weechat_user.sr.html[Корисничко упутство ^↗^^].
|       includes/                               | Фајлови укључени у документацију.
|          cmdline_options.XX.adoc              | Опције командне линије (фајл се укључује у man странице и корисничко упутство).
|          man.XX.adoc                          | Део man страница: опције додатака, фајлови и ауторска права.
|===

Преводи програма WeeChat и додатака се раде помоћу програма gettext, фајлови се налазе у _po/_ директоријуму:

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл    | Опис
| po/            | Фајлови превода (gettext).
|    XX.po       | Преводи за језик XX (fr, de, it, ...), базни језик је енглески.
|    weechat.pot | Шаблон за преводе (аутоматски изграђен).
|===

[[coding_rules]]
== Правила за писање кода

[[coding_general_rules]]
=== Општа правила

* Ваши коментари, имена променљивих, ... у изворном коду морају бити написани *само* на енглеском језику (није дозвољена употреба ниједног другог језика).
* Употребите заглавље ауторских права у сваком новом изворном фајлу са:
** датумом
** именом
** имејл адресом
** лиценцом
** кратким описом фајла (једна линија).

Ауторска права и лиценца морају да се поставе употребом SPDX (System Package Data Exchange),
следећи најбољу праксу у REUSE Software
(погледајте https://reuse.software/spec/[REUSE спецификацију ^↗^^]).

Сви фајлови у репозиторијуу морају да имају исправне информације о ауторским правима
и лиценцирању. +
Када информације не могу да се поставе у сам фајл, можете да употребите REUSE.toml фајл
у корену стабла пројекта.

Пример у језику C:

// REUSE-IgnoreStart
[source,c]
----
/*
 * SPDX-FileCopyrightText: 2026 Your Name <your@email.com>
 *
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

/* Core functions for WeeChat */
----
// REUSE-IgnoreEnd

[[coding_c_style]]
=== C стил

Када пишете C кôд, *морате* да се придржавате неких основних правила:

* За увлачење користите 4 размака (без табулатора).
* Покушајте да не прекорачите 80 карактера по линији, осим ако је то неопходно за читљивост.
* Користите коментаре `+/* коментар */+` (а не коментаре у C99 стилу као што је `+// коментар+`).
* Испред сваке функције додајте коментар који објашњава шта она ради (увек користите вишелинијски коментар, чак и ако је опис кратак).

Пример:

[source,c]
----
/*
 * Check if a string with boolean value is valid.
 *
 * Return:
 *   1: boolean value is valid
 *   0: boolean value is NOT valid
 */

int
foo ()
{
    int i;

    /* one line comment */
    i = 1;

    /*
     * multi-line comment: this is a very long description about next block
     * of code
     */
    i = 2;
    printf ("%d\n", i);
}
----

* Користите експлицитна имена променљивих, на пример „nicks_count” уместо „n” или „nc”. Изузетак: у `for` петљама су променљиве као што су „i” или „n” ОК.
* Након декларације, у телу функције иницијализујте локалне променљиве, пример:

[source,c]
----
void
foo ()
{
    int nick_count, buffer_count;

    nick_count = 0;
    buffer_count = 1;
    /* ... */
}
----

* Употребите заграде да експлицитно покажете како се израз израчунава, чак и када нису неопходне, на пример: write `+x + (y * z)+` уместо `+x + y * z+`.
* Постављајте витичасте заграде `+{ }+` саме у линије, и увуците их за број размака који се користио у линији изнад отворене витичасте заграде (`if` у примеру):

[source,c]
----
if (nicks_count == 1)
{
    /* нешто */
}
----

* За раздвајање више различитих блокова унутар функција, употребите празне линије, а ако је могуће, додајте и коментар за сваку. Овако:

[source,c]
----
/*
 * Sends a message from out queue.
 */

void
irc_server_outqueue_send (struct t_irc_server *server)
{
    /* ... */

    /* send signal with command that will be sent to server */
    irc_server_send_signal (server, "irc_out",
                            server->outqueue[priority]->command,
                            server->outqueue[priority]->message_after_mod,
                            NULL);
    tags_to_send = irc_server_get_tags_to_send (server->outqueue[priority]->tags);
    irc_server_send_signal (server, "irc_outtags",
                            server->outqueue[priority]->command,
                            server->outqueue[priority]->message_after_mod,
                            (tags_to_send) ? tags_to_send : "");
    if (tags_to_send)
        free (tags_to_send);

    /* send command */
    irc_server_send (server, server->outqueue[priority]->message_after_mod,
                     strlen (server->outqueue[priority]->message_after_mod));
    server->last_user_message = time_now;

    /* start redirection if redirect is set */
    if (server->outqueue[priority]->redirect)
    {
        irc_redirect_init_command (server->outqueue[priority]->redirect,
                                   server->outqueue[priority]->message_after_mod);
    }

    /* ... */
}
----

* Увлачите `if` услове у употребљавајте заграде око услова са оператором (није потребно само за једну логичку вредност). Овако:

[source,c]
----
if (нешто)
{
    /* нешто */
}
else
{
    /* нешто друго */
}

if (my_boolean1 && my_boolean2 && (i == 10)
    && ((buffer1 != buffer2) || (window1 != window2)))
{
    /* нешто */
}
else
{
    /* нешто друго */
}
----

* Увлачите `switch` наредбе на следећи начин:

[source,c]
----
switch (string[0])
{
    case 'A':  /* first case */
        foo ("abc", "def");
        break;
    case 'B':  /* second case */
        bar (1, 2, 3);
        break;
    default:  /* other cases */
        baz ();
        break;
}
----

* Користите `typedef` за прототипе функција, али не и за структуре:

[source,c]
----
typedef int (t_hook_callback_fd)(void *data, int fd);

struct t_hook_fd
{
    t_hook_callback_fd *callback;      /* fd callback                       */
    int fd;                            /* socket or file descriptor         */
    int flags;                         /* fd flags (read,write,..)          */
    int error;                         /* contains errno if error occurred  */
                                       /* with fd                           */
};

/* ... */

struct t_hook_fd *new_hook_fd;

new_hook_fd = malloc (sizeof (*new_hook_fd));
----

* Ако користите Emacs као текст едитор, за исправно увлачење можете у свом _~/.emacs.el_ употребити Lisp кôд који следи:

[source,lisp]
----
(add-hook 'c-mode-common-hook
          '(lambda ()
             (c-toggle-hungry-state t)
             (c-set-style "k&r")
             (setq c-basic-offset 4)
             (c-tab-always-indent t)
             (c-set-offset 'case-label '+)))
----

[[coding_python_style]]
=== Python стил

Погледајте https://www.python.org/dev/peps/pep-0008/[PEP 8 ^↗^^].

[[core_internals]]
== Интерне ствари језгра

[[naming_convention]]
=== Конвенција именовања

[[naming_convention_files]]
==== Фајлови

Имена фајлова се састоје од слова и цртица, у формату: _xxx-yyyyy.[ch]_, где је _xxx_ директоријум/компонента (може бити и скраћеница), а _yyyyy_ је име за фајл.

Главни фајл директоријума може имати исто име као и директоријум, на пример _irc.c_ у irc додатку.

Примери:

[width="100%", cols="2m,3", options="header"]
|===
| Директоријум        | Фајлови
| src/core/           | weechat.c, core-backtrace.c, core-command.c, ...
| src/gui/            | gui-bar.c, gui-bar-item.c, gui-bar-window.c, ...
| src/gui/curses/     | gui-curses-bar.c, gui-curses-bar-window.c, gui-curses-chat.c, ...
| src/plugins/        | plugin.c, plugin-api.c, plugin-api-info.c, plugin-config.c, plugin-script.c, ...
| src/plugins/irc/    | irc.c, irc-bar-item.c, irc-buffer.c, ...
| src/plugins/python/ | weechat-python.c, weechat-python-api.c, ...
|===

Заглавља C фајлова имају сито име као и фајл, на пример _core-command.h_ за фајл _core-command.c_.

[[naming_convention_structures]]
==== Структуре

Структуре имају име _t_X_Y_ или _t_X_Y_Z_:

* _X_: директоријум/компонента (може бити и скраћеница)
* _Y_: крај имена фајла
* _Z_: име за структуру (није обавезно)

Пример: IRC надимак (из _src/plugins/irc/irc-nick.h_):

[source,c]
----
struct t_irc_nick
{
    char *name;                     /* nickname                              */
    char *host;                     /* full hostname                         */
    char *prefixes;                 /* string with prefixes enabled for nick */
    char prefix[2];                 /* current prefix (higher prefix set in  */
                                    /* prefixes)                             */
    int away;                       /* 1 if nick is away                     */
    char *color;                    /* color for nickname in chat window     */
    struct t_irc_nick *prev_nick;   /* link to previous nick on channel      */
    struct t_irc_nick *next_nick;   /* link to next nick on channel          */
};
----

[[naming_convention_variables]]
==== Променљиве

Глобалне променљиве (ван функција) имају име _X_Y_Z_:

* _X_: директоријум/компонента (може бити и скраћеница)
* _Y_: крај имена фајла
* _Z_: име за променљиву

Изузетак су променљиве за „последњи” чвор листе, име је _last_X_ (где је _X_ име променљиве, користећи облик једнине).

Пример: прозори (from _src/gui/gui-window.c_):

[source,c]
----
struct t_gui_window *gui_windows = NULL;        /* first window             */
struct t_gui_window *last_gui_window = NULL;    /* last window              */
struct t_gui_window *gui_current_window = NULL; /* current window           */
----

За локалне променљиве (у функцијама) нема конвенције давања имена. Једина препорука је да име буде експлицитно (не сувише кратко). +
Ипак, показивачи на структуре се често именују са _ptr_xxxx_, на пример показивач на структуру _struct t_gui_buffer *_ ће бити: _*ptr_buffer_.

[[naming_convention_functions]]
==== Функције

Конвенција именовања функција је иста као за <<naming_convention_variables,променљиве>>.

Пример: креирање новог прозора (из _src/gui/gui-window.c_):

[source,c]
----
/*
 * Create a new window.
 *
 * Return pointer to new window, NULL if error.
 */

struct t_gui_window *
gui_window_new (struct t_gui_window *parent_window, struct t_gui_buffer *buffer,
                int x, int y, int width, int height,
                int width_pct, int height_pct)
{
    /* ... */

    return new_window;
}
----

[[single_thread]]
=== Једна нит извршавања

Програм WeeChat се извршава у једној нити. То значи да би сваки део кода требало да се извршава веома брзо и да су позиви функција као што је `sleep` *стриктно забрањени* (то је тачно за WeeChat језгро, али и за C додатке и скрипте).

Ако из неког разлога морате да одспавате накратко, употребите `hook_timer` са функцијом повратног позива.

[[doubly_linked_lists]]
=== Двоструко уланчане листе

Већина листи у програму WeeChat су двоструко уланчане листе: сваки чвор има показивач на претходни и на следећи чвор.

Пример: листа бафера (из _src/gui/gui-buffer.h_):

[source,c]
----
struct t_gui_buffer
{
    /* data */

    /* ... */

    struct t_gui_buffer *prev_buffer;  /* link to previous buffer           */
    struct t_gui_buffer *next_buffer;  /* link to next buffer               */
};
----

Затим, сва показивача листе, на чело и на реп листе:

[source,c]
----
struct t_gui_buffer *gui_buffers = NULL;           /* first buffer          */
struct t_gui_buffer *last_gui_buffer = NULL;       /* last buffer           */
----

[[color_codes_in_strings]]
=== Кодови боја у стринговима

Програм WeeChat користи сопствене кодове боја у стринговима за приказ атрибута (подебљано, подвучено, ...) и боја на екрану.

Испред свих атрибута/боја се налази карактер у стрингу који може бити:

* _0x19_: кôд боје (иза кога следи кôд (или више њих) боје))
* _0x1A_: постављање атрибута (након којег следи један карактер сировог атрибута)
* _0x1B_: уклањање атрибута (након којег следи један карактер сировог атрибута)
* _0x1C_: ресет (нема ништа иза)

Могуће су следеће боје:

* стандардна боја: необавезни атрибути + двоцифрени број
* проширена боја: `+@+` + необавезни атрибути + петоцифрени број

У следећој табели се подразумева следеће:

* `СТД`: стандардна боја (2 цифре)
* `(ATTR)СТД`: стандардна боја са необавезним атрибутима (атрибути + 2 цифре)
* `ПРО`: проширена боја (`+@+` + 5 цифара)
* `(ATTR)ПРО`: проширена боја са необавезним атрибутима (`+@+` + атрибути + 5 цифара)
* `(ATTR)`: један или више карактера атрибута:
** `+%+`: трептање
** `+.+`: „dim” (затамњено)
** `+*+`: подебљано
** `+!+`: обрнуто
** `+/+`: курзив
** `+_+`: подвучено
** `+|+`: задржавају се постојећи атрибути
* `(a)`: један сирови карактер атрибута:
** _0x01_: подебљано
** _0x02_: обрнуто
** _0x03_: курзив
** _0x04_: подвучено
** _0x05_: трептање
** _0x06_: „dim” (затамњено)

У следећој табели су сажете све комбинације:

[width="100%", cols="4,3,2,8", options="header"]
|===
| Кôд                                               | Пример                       | Површине    | Опис
| [hex]#19# + `СТД`                                 | [hex]#19# `+01+`             | чет + траке | Постављање атрибута и боје опцијама, погледајте табелу испод.
| [hex]#19# + `ПРО`                                 | [hex]#19# `+@00001+`         | chat        | Постављање боје са ncurses паром (користи се само у `/color` баферу).
| [hex]#19# + `F` + `(ATTR)СТД`                     | [hex]#19# `+F*05+`           | чет + траке | Постављање предњег плана (WeeChat боја).
| [hex]#19# + `F` + `(ATTR)ПРО`                     | [hex]#19# `+F@00214+`        | чет + траке | Постављање предњег плана (проширена боја).
| [hex]#19# + `B` + `СТД`                           | [hex]#19# `+B05+`            | чет + траке | Постављање предњег плана (WeeChat боја).
| [hex]#19# + `B` + `ПРО`                           | [hex]#19# `+B@00124+`        | чет + траке | Постављање предњег плана (проширена боја).
| [hex]#19# + `*` + `(ATTR)СТД`                     | [hex]#19# `+*05+`            | чет + траке | Постављање предњег плана (WeeChat боја).
| [hex]#19# + `*` + `(ATTR)ПРО`                     | [hex]#19# `+*@00214+`        | чет + траке | Постављање предњег плана (проширена боја).
| [hex]#19# + `*` + `(ATTR)СТД` + `,` + `СТД` ^(1)^ | [hex]#19# `+*08,05+`         | чет + траке | Постављање предњег плана/позадине (WeeChat боје).
| [hex]#19# + `*` + `(ATTR)СТД` + `,` + `ПРО` ^(1)^ | [hex]#19# `+*01,@00214+`     | чет + траке | Постављање предњег плана (WeeChat боје) у позадине (проширена боја).
| [hex]#19# + `*` + `(ATTR)ПРО` + `,` + `СТД` ^(1)^ | [hex]#19# `+*@00214,05+`     | чет + траке | Постављање предњег плана (extended color) и позадине (WeeChat color).
| [hex]#19# + `*` + `(ATTR)ПРО` + `,` + `ПРО` ^(1)^ | [hex]#19# `+*@00214,@00017+` | чет + траке | Постављање предњег плана/позадине (проширене боје).
| [hex]#19# + `*` + `(ATTR)СТД` + `~` + `СТД`       | [hex]#19# `+*08~05+`         | чет + траке | Постављање предњег плана/позадине (WeeChat боје).
| [hex]#19# + `*` + `(ATTR)СТД` + `~` + `ПРО`       | [hex]#19# `+*01~@00214+`     | чет + траке | Постављање предњег плана (WeeChat color) и позадине (проширена боја).
| [hex]#19# + `*` + `(ATTR)ПРО` + `~` + `СТД`       | [hex]#19# `+*@00214~05+`     | чет + траке | Постављање предњег плана (проширена боја) и позадине (WeeChat color).
| [hex]#19# + `*` + `(ATTR)ПРО` + `~` + `ПРО`       | [hex]#19# `+*@00214~@00017+` | чет + траке | Постављање предњег плана/позадине (проширене боје).
| [hex]#19# + `b` + `F`                             | [hex]#19# `+bF+`             | траке       | Постављање боје предњег плана траке.
| [hex]#19# + `b` + `D`                             | [hex]#19# `+bD+`             | траке       | Постављање боје граничника траке.
| [hex]#19# + `b` + `B`                             | [hex]#19# `+bB+`             | траке       | Постављање боје позадине траке.
| [hex]#19# + `b` + `_`                             | [hex]#19# `+b_+`             | трака уноса | Почетак уноса карактера (користи се само у ставки „input_text”).
| [hex]#19# + `b` + `-`                             | [hex]#19# `+b-+`             | трака уноса | Почетак уноса скривеног карактера (користи се само у ставки „input_text”).
| [hex]#19# + `b` + `#`                             | [hex]#19# `+b#+`             | трака уноса | Померање курсор карактера (користи се само у ставки „input_text”).
| [hex]#19# + `b` + `i`                             | [hex]#19# `+bi+`             | траке       | Почетак ставке.
| [hex]#19# + `b` + `l` (мало L)                    | [hex]#19# `+bl+`             | траке       | Почетак линије ставке.
| [hex]#19# + `E`                                   | [hex]#19# `+E+`              | чет + траке | Наглашавање текста _(WeeChat ≥ 0.4.2)_.
| [hex]#19# + [hex]#1C#                             | [hex]#19# [hex]#1C#          | чет + траке | Ресет боје (уз задржавање атрибута).
| [hex]#1A# + `(a)`                                 | [hex]#1A# [hex]#01#          | чет + траке | Постављање атрибута.
| [hex]#1B# + `(a)`                                 | [hex]#1B# [hex]#01#          | чет + траке | Уклањање атрибута.
| [hex]#1C#                                         | [hex]#1C#                    | чет + траке | Ресет атрибута и боје.
|===

[NOTE]
^(1)^ Као граничник се користила запета све до верзије WeeChat 2.5. +
У верзијама WeeChat ≥ 2.6, користи се тилда за раздвајање боје предњег плана од боје позадине. Ако развијате WeeChat релеј клијент и желите да буде компатибилан са свим WeeChat верзијама, требало би да подржава оба граничника (на пример, корисник са WeeChat ≤ 2.5 изврши `/upgrade` на верзију ≥ 2.6, па би у баферима оба граничника могла да се користе у исто време).

Кодови боја употребом опција (погледајте _t_gui_color_enum_, у фајлу _src/gui/gui-color.h_):

[width="80%", cols="^1m,10", options="header"]
|===
| Кôд  | Опција
| 00   | weechat.color.separator
| 01   | weechat.color.chat
| 02   | weechat.color.chat_time
| 03   | weechat.color.chat_time_delimiters
| 04   | weechat.color.chat_prefix_error
| 05   | weechat.color.chat_prefix_network
| 06   | weechat.color.chat_prefix_action
| 07   | weechat.color.chat_prefix_join
| 08   | weechat.color.chat_prefix_quit
| 09   | weechat.color.chat_prefix_more
| 10   | weechat.color.chat_prefix_suffix
| 11   | weechat.color.chat_buffer
| 12   | weechat.color.chat_server
| 13   | weechat.color.chat_channel
| 14   | weechat.color.chat_nick
| 15   | weechat.color.chat_nick_self
| 16   | weechat.color.chat_nick_other
| 17   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 18   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 19   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 20   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 21   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 22   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 23   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 24   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 25   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 26   | _(од WeeChat верзије 0.3.4 се више не користи)_
| 27   | weechat.color.chat_host
| 28   | weechat.color.chat_delimiters
| 29   | weechat.color.chat_highlight
| 30   | weechat.color.chat_read_marker
| 31   | weechat.color.chat_text_found
| 32   | weechat.color.chat_value
| 33   | weechat.color.chat_prefix_buffer
| 34   | weechat.color.chat_tags _(WeeChat ≥ 0.3.6)_
| 35   | weechat.color.chat_inactive_window _(WeeChat ≥ 0.3.6)_
| 36   | weechat.color.chat_inactive_buffer _(WeeChat ≥ 0.3.6)_
| 37   | weechat.color.chat_prefix_buffer_inactive_buffer _(WeeChat ≥ 0.3.6)_
| 38   | weechat.color.chat_nick_offline _(WeeChat ≥ 0.3.9)_
| 39   | weechat.color.chat_nick_offline_highlight _(WeeChat ≥ 0.3.9)_
| 40   | weechat.color.chat_nick_prefix _(WeeChat ≥ 0.4.1)_
| 41   | weechat.color.chat_nick_suffix _(WeeChat ≥ 0.4.1)_
| 42   | weechat.color.emphasized _(WeeChat ≥ 0.4.2)_
| 43   | weechat.color.chat_day_change _(WeeChat ≥ 0.4.2)_
| 44   | weechat.color.chat_value_null _(WeeChat ≥ 1.4)_
| 45   | weechat.color.chat_status_disabled _(WeeChat ≥ 4.0.0)_
| 46   | weechat.color.chat_status_enabled _(WeeChat ≥ 4.0.0)_
|===

Ово су WeeChat боје:

[width="80%", cols="^1m,10", options="header"]
|===
| Кôд  | Боја
| 00   | Подразумевана (боја предњег плана/позадине у терминалу)
| 01   | Црна
| 02   | Тамносива
| 03   | Тамноцрвена
| 04   | Светлоцрвена
| 05   | Тамнозелена
| 06   | Светлозелена
| 07   | Браон
| 08   | Жута
| 09   | Тамноплава
| 10   | Светлоплава
| 11   | Тамномагента
| 12   | Светломагента
| 13   | Тамнотиркизна
| 14   | Светлотиркизна
| 15   | Сива
| 16   | Бела
|===

Примери кодова боја:

[width="100%", cols="1,2", options="header"]
|===
| Кôд                            | Опис
| [hex]#19# `+01+`               | Боја опције "01" (текст разговора)
| [hex]#19# `+*08,03+`           | Жута на црвеном
| [hex]#19# `+*@00214+`          | Наранџаста (проширена боја 214)
| [hex]#19# `+*@*_00214,@00017+` | Подебљана подвучена наранџаста (214) на тамноплавој (17)
| [hex]#1A# `+_+`                | Поставља подвлачење
| [hex]#1B# `+_+`                | Уклања подвлачење
| [hex]#1C#                      | Ресетује атрибуте и боје
|===

[[plugin_internals]]
== Интерне ствари додатака

Фајл _src/plugins/weechat-plugin.h_ дефинише и извози све функције које су доступне у API.

За чување информација о додатку се користи структура под именом _t_weechat_plugin_ (име фајла, име, аутор, опис, ...) и све API функције, као показивачи на WeeChat функције.

Дефинисани су и неки макрои за позивање ових функција.

На пример, функција _hook_timer_ је дефинисана у структури _t_weechat_plugin_ на следећи начин:

[source,c]
----
struct t_hook *(*hook_timer) (struct t_weechat_plugin *plugin,
                              long interval,
                              int align_second,
                              int max_calls,
                              int (*callback)(void *data,
                                              int remaining_calls),
                              void *callback_data);
----

А макро који се користи за позивање ове функције је:

[source,c]
----
#define weechat_hook_timer(__interval, __align_second, __max_calls,     \
                           __callback, __data)                          \
    weechat_plugin->hook_timer(weechat_plugin, __interval,              \
                               __align_second, __max_calls,             \
                               __callback, __data)
----

Тако да ће у додатку позив функције изгледати овако:

[source,c]
----
server->hook_timer_sasl = weechat_hook_timer (timeout * 1000,
                                              0, 1,
                                              &irc_server_timer_sasl_cb,
                                              server);
----

[[contribute]]
== Давање доприноса програму WeeChat

[[git_repository]]
=== Git репозиторијум

Гит репозиторијум се налази на https://github.com/weechat/weechat[GitHub ^↗^^].

Било каква закрпа бага или нова могућност мора да да се уради над мастер граном, пожељно је преко GitHub pull захтева. Закрпа такође може да се пошаље и имејлом (направљена са `git diff` или `git format-patch`).

Формат комит поруке је следећи (са аутоматским затварањем GitHub проблема):

----
компонента: исправка проблема (затвара #123)
----

Где је _компонента_ једно од следећег:

[width="100%",cols="1m,4m,5",options="header"]
|===
| Компонента | Фајлови | Опис

| core
| AUTHORS.md +
  CHANGELOG.md +
  CONTRIBUTING.md +
  .github/FUNDING.yml +
  .github/ISSUE_TEMPLATE/* +
  icons/* +
  po/* +
  README.md +
  UPGRADING.md +
  src/core/* +
  src/gui/* +
  version.sh +
  weechat.desktop
| WeeChat језгро

| build
| CMakeLists.txt +
  cmake/* +
  tools/* +
  weechat.cygport.in
| Изградња

| ci
| .github/workflows/*
| Непрекидна интеграција

| debian
| debian-devel/* +
  debian-stable/*
| Debian паковање

| tests/fuzz
| tests/fuzz/*
| Fuzz тестирање

| tests/unit
| tests/unit/*
| Unit тестови

| doc
| doc/*
| Општа ажурирања документације, на пример за изградњу

| doc/man
| doc/xx/weechat.1.xx.adoc +
  doc/xx/weechat-headless.1.xx.adoc
| Man странице

| doc/faq
| doc/xx/weechat_faq.xx.adoc
| Често постављана питања (ЧПП)

| doc/quickstart
| doc/xx/weechat_quickstart.xx.adoc
| Водич за брзи почетак

| doc/user
| doc/xx/weechat_user.xx.adoc
| Корисничко упутство

| doc/scripting
| doc/xx/weechat_scripting.xx.adoc
| Водич за скриптовање

| doc/api
| doc/xx/weechat_plugin_api.xx.adoc
| Референтни приручник API додатака

| doc/relay
| doc/xx/weechat_relay_api.xx.adoc +
  doc/xx/weechat_relay_weechat.xx.adoc
| Релеј протоколи

| doc/dev
| doc/xx/weechat_dev.en.adoc
| Водич за програмере

| irc +
  python +
  relay +
  …
| src/plugins/<име>/*
| Додатак

|===

Нека правила која треба да поштујете:

* Користите само енглески језик.
* Користите глагол у инфинитиву.
* Ако је комит у вези са GitHub проблемом, напишите га у заградама након поруке, у формату: `(issue #123)` или `(closes #123)` да га затворите.

Примери комит порука:

----
core: add callback "nickcmp" for nick comparison in buffers
core: update Japanese translations
irc: add command /unquiet (closes #36)
python: fix crash when unloading a script without pointer to interpreter
ruby: add detection of ruby version 1.9.3 in CMake
----

[[translations]]
=== Преводи

[[gettext]]
==== Gettext

Gettext фајлови се налазе у _po/_ директоријуму.

Ако желите да иницијализујете нови језик, употребите команду `msginit`. На пример, да бисте креирали нови фајл који је спреман за превод на холандски:

[source,shell]
----
cd po
msginit -i weechat.pot -l nl_NL -o nl.po
----

Базни језик за програм WeeChat је енглески, тако да се подразумева да перфектно разумете енглески како бисте могли да урадите превод на свој језик.

Након измена у изворним фајловима, можете да регенеришете све фајлове превода следећом командом у CMake „build” директоријуму:

[source,shell]
----
make translations && make update-po
----

Затим можете да уређујте .po фајлове (ако можете да преводите на језик).

Када завршите, *морате* да проверите свој фајл са
https://github.com/flashcode/msgcheck[msgcheck ^↗^^]:

[source,shell]
----
msgcheck.py xx.po
----

И након тога можете да рекомпајлирате програм WeeChat тако да користи нове преводе.

[[asciidoc]]
==== Asciidoc

Asciidoc фајлови се налазе у директоријуму _doc/XX/_ где је _XX_ језик (en, fr, de, it, ...).

Најпре направите копију енглеског asciidoc фајла (у директоријуму _doc/en/_), па затим радите на њој.

Преводи који недостају у фајловима су назначени следећим стрингом:

----
// TRANSLATION MISSING
----

Морате да преведете комплетан фајл осим линкова и специјалних кључних речи за напомене, упозорења, ... Ове речи морате оставити непреведене:

----
[[име_линка]]
<<име_линка>>

[NOTE]
[TIP]
[IMPORTANT]
[WARNING]
[CAUTION]
----

Када након `+<<име_линка>>+` постоји име, онда морате да га преведете:

----
<<име_линка,овај текст мора да се преведе>>
----
