# WeeChat водич за програмере

Sébastien Helleu
flashcode@flashtux.org
верзија 4.8.1

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

Последња верзија овог документа може да се пронађе на овој страници ↗.

## 1. Увод

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

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

- репозиторијуми

- правила за писање кода

- интерне ствари језгра

- интерне ствари додатака

- како дати допринос програму WeeChat.

## 2. Репозиторијуми

WeeChat репозиторијуми се налазе на GitHub организацији weechat ↗.

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

weechat

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

scripts

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

weechat.org

  изворни кôд WeeChat вебсајта ↗

weercd

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

qweechat

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

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

### 2.1. Преглед

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

Директоријум | Опис
--- | ---
`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 паковање.

### 2.2. Извори

#### Језгро

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

- src/core/: функције језгра (за манипулацију подацима)

- src/gui/: функције у вези интерфејса (бафери, прозори, …​)

Путања/фајл | Опис
--- | ---
`core/` | Функције језгра: тачка улаза, интерне структуре.
`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 интерфејс.

#### Додаци

Путања/фајл | Опис
--- | ---
`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 ажурира.

#### Тестови

Путања/фајл | Опис
--- | ---
`tests/` | Корен тестова.
`fuzz/` | Корен fuzz тестирања.
`ossfuzz.sh` | Скрипта изградње за 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` | Тестови: мрежне функције.

### 2.3. Документација / преводи

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

Путања/фајл | Опис
--- | ---
`doc/` | Документација.
`docinfo.html` | Asciidoctor стил.
`XX/` | Документација за језик XX (језици: en, fr, de, it, …​).
`weechat.1.XX.adoc` | Man страница(`man weechat`).
`weechat_dev.XX.adoc` | Водич за програмере ↗ (овај документ).
`weechat_faq.XX.adoc` | ЧПП ↗.
`weechat_plugin_api.XX.adoc` | Референца за API додатака ↗.
`weechat_quickstart.XX.adoc` | Водич за брзи почетак ↗.
`weechat_relay_api.XX.adoc` | Релеј „api” протокол (за удаљене интерфејсе).
`weechat_relay_weechat.XX.adoc` | Релеј „weechat” протокол ↗ (за удаљене интерфејсе).
`weechat_scripting.XX.adoc` | Водич за скриптовање ↗.
`weechat_user.XX.adoc` | Корисничко упутство ↗.
`includes/` | Фајлови укључени у документацију.
`cmdline_options.XX.adoc` | Опције командне линије (фајл се укључује у man странице и корисничко упутство).
`man.XX.adoc` | Део man страница: опције додатака, фајлови и ауторска права.

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

Путања/фајл | Опис
--- | ---
`po/` | Фајлови превода (gettext).
`XX.po` | Преводи за језик XX (fr, de, it, …​), базни језик је енглески.
`weechat.pot` | Шаблон за преводе (аутоматски изграђен).

## 3. Правила за писање кода

### 3.1. Општа правила

- Ваши коментари, имена променљивих, …​ у изворном коду морају бити написани само на енглеском језику (није дозвољена употреба ниједног другог језика).

- Употребите заглавље ауторских права у сваком новом изворном фајлу са:

  - датумом

  - именом

  - имејл адресом

  - лиценцом

  - кратким описом фајла (једна линија).

Ауторска права и лиценца морају да се поставе употребом SPDX (System Package Data Exchange), следећи најбољу праксу у REUSE Software (погледајте REUSE спецификацију ↗).

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

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

    /*
     * SPDX-FileCopyrightText: 2025 Your Name <your@email.com>
     *
     * SPDX-License-Identifier: GPL-3.0-or-later
     *
     * This file is part of WeeChat, the extensible chat client.
     *
     * WeeChat is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 3 of the License, or
     * (at your option) any later version.
     *
     * WeeChat is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with WeeChat.  If not, see <https://www.gnu.org/licenses/>.
     */

    /* Core functions for WeeChat */

### 3.2. C стил

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

- За увлачење користите 4 размака (без табулатора).

- Покушајте да не прекорачите 80 карактера по линији, осим ако је то неопходно за читљивост.

- Користите коментаре `/* коментар */` (а не коментаре у C99 стилу као што је `// коментар`).

- Испред сваке функције додајте коментар који објашњава шта она ради (увек користите вишелинијски коментар, чак и ако је опис кратак).

Пример:

    /*
     * Checks if a string with boolean value is valid.
     *
     * Returns:
     *   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” ОК.

- Након декларације, у телу функције иницијализујте локалне променљиве, пример:

    void
    foo ()
    {
        int nick_count, buffer_count;

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

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

- Постављајте витичасте заграде `{ }` саме у линије, и увуците их за број размака који се користио у линији изнад отворене витичасте заграде (`if` у примеру):

    if (nicks_count == 1)
    {
        /* нешто */
    }

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

    /*
     * 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` услове у употребљавајте заграде око услова са оператором (није потребно само за једну логичку вредност). Овако:

    if (нешто)
    {
        /* нешто */
    }
    else
    {
        /* нешто друго */
    }

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

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

    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` за прототипе функција, али не и за структуре:

    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 кôд који следи:

    (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 '+)))

### 3.3. Python стил

Погледајте PEP 8 ↗.

## 4. Интерне ствари језгра

### 4.1. Конвенција именовања

#### Фајлови

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

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

Примери:

Директоријум | Фајлови
--- | ---
`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.

#### Структуре

Структуре имају име t_X_Y или t_X_Y_Z:

- X: директоријум/компонента (може бити и скраћеница)

- Y: крај имена фајла

- Z: име за структуру (није обавезно)

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

    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          */
    };

#### Променљиве

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

- X: директоријум/компонента (може бити и скраћеница)

- Y: крај имена фајла

- Z: име за променљиву

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

Пример: прозори (from src/gui/gui-window.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.

#### Функције

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

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

    /*
     * Creates a new window.
     *
     * Returns 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;
    }

### 4.2. Једна нит извршавања

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

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

### 4.3. Двоструко уланчане листе

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

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

    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               */
    };

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

    struct t_gui_buffer *gui_buffers = NULL;           /* first buffer          */
    struct t_gui_buffer *last_gui_buffer = NULL;       /* last buffer           */

### 4.4. Кодови боја у стринговима

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

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

- 0x19: кôд боје (иза кога следи кôд (или више њих) боје))

- 0x1A: постављање атрибута (након којег следи један карактер сировог атрибута)

- 0x1B: уклањање атрибута (након којег следи један карактер сировог атрибута)

- 0x1C: ресет (нема ништа иза)

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

- стандардна боја: необавезни атрибути + двоцифрени број

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

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

- `СТД`: стандардна боја (2 цифре)

- `(ATTR)СТД`: стандардна боја са необавезним атрибутима (атрибути + 2 цифре)

- `ПРО`: проширена боја (`@` + 5 цифара)

- `(ATTR)ПРО`: проширена боја са необавезним атрибутима (`@` + атрибути + 5 цифара)

- `(ATTR)`: један или више карактера атрибута:

  - `%`: трептање

  - `.`: „dim” (затамњено)

  - `*`: подебљано

  - `!`: обрнуто

  - `/`: курзив

  - `_`: подвучено

  - `|`: задржавају се постојећи атрибути

- `(a)`: један сирови карактер атрибута:

  - 0x01: подебљано

  - 0x02: обрнуто

  - 0x03: курзив

  - 0x04: подвучено

  - 0x05: трептање

  - 0x06: „dim” (затамњено)

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

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

Белешка

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

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

Кôд | Опција
--- | ---
`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 боје:

Кôд | Боја
--- | ---
`00` | Подразумевана (боја предњег плана/позадине у терминалу)
`01` | Црна
`02` | Тамносива
`03` | Тамноцрвена
`04` | Светлоцрвена
`05` | Тамнозелена
`06` | Светлозелена
`07` | Браон
`08` | Жута
`09` | Тамноплава
`10` | Светлоплава
`11` | Тамномагента
`12` | Светломагента
`13` | Тамнотиркизна
`14` | Светлотиркизна
`15` | Сива
`16` | Бела

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

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

## 5. Интерне ствари додатака

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

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

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

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

    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);

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

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

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

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

## 6. Давање доприноса програму WeeChat

### 6.1. Git репозиторијум

Гит репозиторијум се налази на GitHub ↗.

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

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

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

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

Компонента | Фајлови | Опис
--- | --- | ---
`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

### 6.2. Преводи

#### Gettext

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

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

    cd po
    msginit -i weechat.pot -l nl_NL -o nl.po

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

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

    make translations && make update-po

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

Када завршите, морате да проверите свој фајл са msgcheck ↗:

    msgcheck.py xx.po

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

#### Asciidoc

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

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

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

    // TRANSLATION MISSING

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

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

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

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

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