= WeeChat водич за програмере
:author: Sébastien Helleu
:email: flashcode@flashtux.org
:lang: sr
:toc: left
:toclevels: 3
:toc-title: Садржај
:sectnums:
:docinfo1:

Превод:

* Иван Пешић (<ivan.pesic@gmail.com>), 2021.


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

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


[[introduction]]
== Увод

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

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

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

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

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

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

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

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

weechat.org::
    извор WeeChat веб сајта: https://weechat.org/

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/             | Тестови.
|    scripts/        | Тестови за API скриптовања.
|       python/      | Python скрипте за генерисање и покретање тестова за API скриптовања.
|    unit/           | Unit тестови.
|       core/        | Unit тестови за функције језгра.
|       gui/         | Unit тестови за функције интерфејса.
|       plugins/     | Unit тестови за додатке.
|          irc/      | Unit тестови за IRC додатак.
| doc/               | Документација.
| po/                | Фајлови превода (gettext).
| debian/            | Debian паковање.
|===

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

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

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

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

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл                     | Опис
| core/                           | Функције језгра: тачка улаза, интерне структуре.
|    wee-arraylist.c              | Листе низова.
|    wee-backtrace.c              | Испис трага након краха.
|    wee-calc.c                   | Израчунавање резултата израза.
|    wee-command.c                | WeeChat команде језгра.
|    wee-completion.c             | Подразумевана довршавања.
|    wee-config-file.c            | Управљање конфигурационим фајловима.
|    wee-config.c                 | Конфигурационе опције за WeeChat језгро (фајл weechat.conf).
|    wee-crypto.c                 | Криптографске функције.
|    wee-debug.c                  | Неке дибаг функције.
|    wee-dir.c                    | Функције директоријума/фајла.
|    wee-eval.c                   | Израчунавање израза са референцама на интерне променљиве.
|    wee-hashtable.c              | Хеш табеле.
|    wee-hdata.c                  | Hdata (директни приступ подацима употребом хеш табела).
|    wee-hook.c                   | Куке.
|    wee-infolist.c               | Инфолисте (листе са подацима објеката).
|    wee-input.c                  | Унос команди/текста.
|    wee-list.c                   | Сортиране листе.
|    wee-log.c                    | Упис у WeeChat лог фајл (weechat.log).
|    wee-network.c                | Мрежне функције (повезивање са серверима/проксијима).
|    wee-proxy.c                  | Управљање проксијима.
|    wee-secure.c                 | Функције обезбеђених података.
|    wee-secure-buffer.c          | Бафер обезбеђених података.
|    wee-secure-config.c          | Опције обезбеђених података (фајл sec.conf).
|    wee-string.c                 | Функције над стринговима.
|    wee-upgrade-file.c           | Интерни систем ажурирања.
|    wee-upgrade.c                | Ажурирање за WeeChat језгро (бафери, линије, историја, ...).
|    wee-url.c                    | URL трансфер (помоћу libcurl).
|    wee-utf8.c                   | UTF-8 фунцкије.
|    wee-util.c                   | Неке друге функције.
|    wee-version.c                | Функције за WeeChat верзију.
|    weechat.c                    | Основне функције: опције командне линије, покретање.
|    hook/                        | Функције кука.
|       wee-hook-command-run.c    | Кука "command_run".
|       wee-hook-command.c        | Кука "command".
|       wee-hook-completion.c     | Кука "completion".
|       wee-hook-config.c         | Кука "config".
|       wee-hook-connect.c        | Кука "connect".
|       wee-hook-fd.c             | Кука "fd".
|       wee-hook-focus.c          | Кука "focus".
|       wee-hook-hdata.c          | Кука "hdata".
|       wee-hook-hsignal.c        | Кука "hsignal".
|       wee-hook-info-hashtable.c | Кука "info_hashtable".
|       wee-hook-info.c           | Кука "info".
|       wee-hook-infolist.c       | Кука "infolist".
|       wee-hook-line.c           | Кука "line".
|       wee-hook-modifier.c       | Кука "modifier".
|       wee-hook-print.c          | Кука "print".
|       wee-hook-process.c        | Кука "process".
|       wee-hook-signal.c         | Кука "signal".
|       wee-hook-timer.c          | Кука "timer".
| 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                   | Линије у баферуLines in buffers.
|    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-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-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-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).
|       irc-raw.c                   | IRC сирови бафер.
|       irc-redirect.c              | Преусмеравање излаза IRC команде.
|       irc-sasl.c                  | SASL аутентификација са IRC сервером.
|       irc-server.c                | У/И комуникација са IRC сервером.
|       irc-tag.c                   | Функције за манипулацију ознакама IRC порука.
|       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-buffer.c              | Релеј бафер.
|       relay-client.c              | Клијенти релеја.
|       relay-command.c             | Релеј команде.
|       relay-completion.c          | Релеј довршавања.
|       relay-config.c              | Релеј опције конфиг (фајл relay.conf).
|       relay-info.c                | Релеј info/infolists/hdata.
|       relay-network.c             | Мрежне функције за релеј.
|       relay-raw.c                 | Релеј сирови бафер.
|       relay-server.c              | Релеј сервер.
|       relay-upgrade.c             | Save/restore of relay data when upgrading WeeChat.
|       relay-websocket.c           | WebSocket сервер функције (RFC 6455).
|       irc/                        | IRC прокси.
|          relay-irc.c              | Главне IRC прокси функције.
|       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/                             | Корен тестова.
|    tests.cpp                       | Програм који се користи за извршавање свих тестова.
|    scripts/                        | Корен тестова за API скриптовања.
|       test-scripts.cpp             | Програм који се користи за извршавање тестова API скриптовања.
|       python/                      | Python скрипте које генеришу и покрећу тестове API скриптовања.
|          testapigen.py             | Python скрипта која генерише скрипте на свим језицима за тестирање API скриптовања.
|          testapi.py                | Python скрипта са тестовима API скриптовања, користи је скрипта testapigen.py.
|          unparse.py                | Конверзија Python кода у остале језике, користи је скрипта testapigen.py.
|    unit/                           | Корен unit тестова.
|       test-plugins.cpp             | Тестови: plugins.
|       core/                        | Корен unit тестова језгра.
|          test-core-arraylist.cpp   | Тестови: arraylists.
|          test-core-calc.cpp        | Тестови: калкулација израза.
|          test-core-crypto.cpp      | Тестови: криптографске функције.
|          test-core-dir.cpp         | Тестови: функције директоријума/фајла.
|          test-core-eval.cpp        | Тестови: израчунавање израза.
|          test-core-hashtble.cpp    | Тестови: hashtables.
|          test-core-hdata.cpp       | Тестови: hdata.
|          test-core-hook.cpp        | Тестови: куке.
|          test-core-infolist.cpp    | Тестови: infolists.
|          test-core-list.cpp        | Тестови: листе.
|          test-core-network.cpp     | Тестови: мрежне функције.
|          test-core-secure.cpp      | Тестови: обезбеђени подаци.
|          test-core-signal.cpp      | Тестови: сигнали.
|          test-core-string.cpp      | Тестови: стрингови.
|          test-core-url.cpp         | Тестови: URL адресе.
|          test-core-utf8.cpp        | Тестови: UTF-8.
|          test-core-util.cpp        | Тестови: помоћне функције.
|       gui/                         | Корен unit тестова интерфејса.
|          test-gui-color.cpp        | Тестови: боје.
|          test-gui-line.cpp         | Тестови: линије.
|          test-gui-nick.cpp         | Тестови: надимци.
|       plugins/                     | Корен unit тестова додатака.
|          irc/                      | Корен unit тестова IRC додатка.
|             test-irc-channel.cpp   | Тестови: IRC канали.
|             test-irc-color.cpp     | Тестови: IRC боје.
|             test-irc-config.cpp    | Тестови: IRC конфигурација.
|             test-irc-ignore.cpp    | Тестови: IRC игнорисања.
|             test-irc-message.cpp   | Тестови: IRC поруке.
|             test-irc-mode.cpp      | Тестови: IRC режими.
|             test-irc-nick.cpp      | Тестови: IRC надимци.
|             test-irc-protocol.cpp  | Тестови: IRC протокол.
|             test-irc-server.cpp    | Тестови: IRC сервер.
|          trigger/                  | Корен unit тестова за окидач додатак.
|             test-trigger.cpp       | Тестови: окидачи.
|          typing/                   | Корен unit тестова за typing додатак.
|             test-typing.cpp        | Тестови: typing.
|             test-typing-status.cpp | Тестови: typing статус.
|          relay/                    | Корен unit тестова за Релеј додатак.
|             test-relay-auth.cpp    | Тестови: аутентификација клијената.

|===

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

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

[width="100%", cols="2m,3", options="header"]
|===
| Путања/фајл                                   | Опис
| doc/                                          | Документација.
|    docinfo.html                               | Asciidoctor стил.
|    docgen.py                                  | Python скрипта која изграђује ауто-генерисане фајлу у директоријуму _includes/_ (погледајте ниже).
|    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_protocol.XX.adoc          | link:weechat_relay_protocol.sr.html[Релеј протокол] (за удаљене интерфејсе).
|       weechat_scripting.XX.adoc               | link:weechat_scripting.sr.html[Водич за скриптовање].
|       weechat_tester.XX.adoc                  | link:weechat_tester.sr.html[Водич за тестере].
|       weechat_user.XX.adoc                    | link:weechat_user.sr.html[Корисничко упутство].
|       includes/                               | Фајлови укључени у документацију.
|          autogen_api_completions.XX.adoc      | Ауто-генерисани фајл за Референцу API додатака: довршавања (*НИКАДА* не ажурирајте ручно!).
|          autogen_api_hdata.XX.adoc            | Ауто-генерисани фајл за Референцу API додатака: hdata (*НИКАДА* не ажурирајте ручно!).
|          autogen_api_infolists.XX.adoc        | Ауто-генерисани фајл за Референцу API додатака: infolists (*НИКАДА* не ажурирајте ручно!).
|          autogen_api_infos.XX.adoc            | Ауто-генерисани фајл за Референцу API додатака: infos (*НИКАДА* не ажурирајте ручно!).
|          autogen_api_infos_hashtable.XX.adoc  | Ауто-генерисани фајл за Референцу API додатака: infos hashtable (*НИКАДА* не ажурирајте ручно!).
|          autogen_api_plugins_priority.XX.adoc | Ауто-генерисани фајл за Референцу API додатака: приоритет додатака (*НИКАДА* не ажурирајте ручно!).
|          autogen_api_url_options.XX.adoc      | Ауто-генерисани фајл за Референцу API додатака: URL опције (*НИКАДА* не ажурирајте ручно!).
|          autogen_user_commands.XX.adoc        | Ауто-генерисани фајл за Корисничко упутство: команде (*НИКАДА* не ажурирајте ручно!).
|          autogen_user_default_aliases.XX.adoc | Ауто-генерисани фајл за Корисничко упутство: подразумевани алијаси (*НИКАДА* не ажурирајте ручно!).
|          autogen_user_irc_colors.XX.adoc      | Ауто-генерисани фајл за Корисничко упутство: IRC боје (*НИКАДА* не ажурирајте ручно!).
|          autogen_user_options.XX.adoc         | Ауто-генерисани фајл за Корисничко упутство: опције конфигурације (*НИКАДА* не ажурирајте ручно!).
|          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]]
=== Општа правила

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

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

[source, C]
----
/*
 * weechat.c - core functions for WeeChat
 *
 * Copyright (C) 2021 Your Name <your@email.com>
 *
 * 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/>.
 */
----

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

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

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

Пример:

[source, C]
----
/*
 * 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” ОК.
* Након декларације, у телу функције иницијализујте локалне променљиве, пример:

[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/

[[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, wee-backtrace.c, wee-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 фајлова имају сито име као и фајл, на пример _wee-command.h_ за фајл _wee-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]
----
/*
 * 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;
}
----

[[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 цифре)
* `(А)СТД`: стандардна боја са необавезним атрибутима (атрибути + 2 цифре)
* `ПРО`: проширена боја (`+@+` + 5 цифара)
* `(A)ПРО`: проширена боја са необавезним атрибутима (`+@+` + атрибути + 5 цифара)
* `АТР`: један карактер атрибута (`+*+`, `+!+`, `+/+`, `+_+` или `+|+`)

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

[width="100%", cols="4,2,2,8", options="header"]
|===
| Кôд                                        | Пример                       | Површине    | Опис
| [hex]#19# + СТД                            | [hex]#19# `+01+`             | чет + траке | Постављање атрибута и боје опцијама, погледајте табелу испод.
| [hex]#19# + ПРО                            | [hex]#19# `+@00001+`         | chat        | Постављање боје са ncurses паром (користи се само у `/color` баферу).
| [hex]#19# + "F" + (A)СТД                   | [hex]#19# `+F*05+`           | чет + траке | Постављање предњег плана (WeeChat боја).
| [hex]#19# + "F" + (A)ПРО                   | [hex]#19# `+F@00214+`        | чет + траке | Постављање предњег плана (проширена боја).
| [hex]#19# + "B" + СТД                      | [hex]#19# `+B05+`            | чет + траке | Постављање предњег плана (WeeChat боја).
| [hex]#19# + "B" + ПРО                      | [hex]#19# `+B@00124+`        | чет + траке | Постављање предњег плана (проширена боја).
| [hex]#19# + "*" + (A)СТД                   | [hex]#19# `+*05+`            | чет + траке | Постављање предњег плана (WeeChat боја).
| [hex]#19# + "*" + (A)ПРО                   | [hex]#19# `+*@00214+`        | чет + траке | Постављање предњег плана (проширена боја).
| [hex]#19# + "*" + (A)СТД + "," + СТД ^(1)^ | [hex]#19# `+*08,05+`         | чет + траке | Постављање предњег плана/позадине (WeeChat боје).
| [hex]#19# + "*" + (A)СТД + "," + ПРО ^(1)^ | [hex]#19# `+*01,@00214+`     | чет + траке | Постављање предњег плана (WeeChat боје) у позадине (проширена боја).
| [hex]#19# + "*" + (A)ПРО + "," + СТД ^(1)^ | [hex]#19# `+*@00214,05+`     | чет + траке | Постављање предњег плана (extended color) и позадине (WeeChat color).
| [hex]#19# + "*" + (A)ПРО + "," + ПРО ^(1)^ | [hex]#19# `+*@00214,@00017+` | чет + траке | Постављање предњег плана/позадине (проширене боје).
| [hex]#19# + "*" + (A)СТД + "~" + СТД       | [hex]#19# `+*08~05+`         | чет + траке | Постављање предњег плана/позадине (WeeChat боје).
| [hex]#19# + "*" + (A)СТД + "~" + ПРО       | [hex]#19# `+*01~@00214+`     | чет + траке | Постављање предњег плана (WeeChat color) и позадине (проширена боја).
| [hex]#19# + "*" + (A)ПРО + "~" + СТД       | [hex]#19# `+*@00214~05+`     | чет + траке | Постављање предњег плана (проширена боја) и позадине (WeeChat color).
| [hex]#19# + "*" + (A)ПРО + "~" + ПРО       | [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# + АТР                            | [hex]#1A# `+*+`              | чет + траке | Постављање атрибута.
| [hex]#1B# + АТР                            | [hex]#1B# `+*+`              | чет + траке | Уклањање атрибута.
| [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)_
|===

Ово су 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 репозиторијум

Git репозиторијум се налази на следећој URL адреси: https://github.com/weechat/weechat

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

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

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

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

* WeeChat језгро: _core_ (фајлови у кореном директоријуму, _po/_ и _src/_, осим _src/plugins/_)
* фајлови документације: _doc_ (фајлови у директоријуму _doc/_)
* име додатка: _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`. На пример, да бисте креирали нови фајл који је спреман за превод на холандски:

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

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

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

----
$ make translations && make update-po
----

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

Када завршите, *морате* да проверите свој фајл скриптом _msgcheck.py_ (https://github.com/flashcode/msgcheck):

----
$ msgcheck.py xx.po
----

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

[[build_autogen_files]]
===== Изградња ауто-генерисаних фајлова

Фајлове са именом `+autogen_*+` у директоријуму _doc/XX/includes/_ аутоматски генерише скрипта _doc/docgen.py_.

Ауто-генерисане фајлове можете поново да изградите директни у својим WeeChat изворима покретањем програма WeeChat у привременом директоријуму и учитавањем скрипте:

----
weechat -t -r "/python load /путања/до/weechat/doc/docgen.py;/docgen;/quit"
----

[[asciidoc]]
==== Asciidoc

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

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

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

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

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

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

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

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

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