// 2010.12.06 # Doj
// Модуль для реализации встроенной помощи

1000 
dup str-dyn *help-names // названия статей
dup str-dyn *help-articles // тексты статей
dup str-dyn *help-summary // краткое описание статьи
dup dyn *help-group // какой группе принадлежит статья
drop

50
variable *help-current-group // текущая группа
0 *help-current-group !
dup str-dyn *help-group-names // названия групп
dup str-dyn *help-group-descriptions // описания групп
drop

: help-group! ( i) *help-current-group ! ;

: help-group: ( B: s "name") source-next-name-passive
              *help-group-names bdyn# dup help-group! 
              " help-group-" source-next-name str+ created ,
              *help-group-names bdyn+
              *help-group-descriptions bdyn+
              does> @ help-group! ;

" Команды, не отнесённые к какой-либо категории"
help-group: misc

// Ищет описание
// Если найти не удалось, то на вершине будет false.
// Иначе, на вершине будет true, а вторым элементом -- индекс найденной
// статьи.
: help-find ( s-F|iT) *help-names bdyn# begin ?dup while 1- dup 
                            *help-names bdyn[]@ 
                            bover str= if bdrop true exit then
                      repeat bdrop false ;

: helped ( s-) bdup str. space help-find 
  if dup *help-articles bdyn[]@ bdup str0 str= 
    if *help-summary bdyn[]@ str. cr
    else drop str. cr then 
  else [.str]" not found"cr then ;
: described ( ss-) *help-articles bdyn+ 
                   *help-names bdyn+
                   str0 *help-summary bdyn+
                   *help-current-group @ *help-group dyn+ ;

: help ( "name"-) source-next-name helped ;
// : describe ( ") source-next-name *help-names str-dyn+ 
                // begin source-next-char uint8->uint [ 34 ] literal = until  
                // source-quote *help-articles str-dyn+ ;

: new-article ( B: s-) *help-names    bdyn+ 
                  str0 *help-articles bdyn+ 
                  str0 *help-summary  bdyn+
                  *help-current-group @ *help-group dyn+ ;

: find-article ( B: s -- i) bdup help-find 
        if bdrop else *help-names bdyn# new-article then ;
: summary ( " xxx\n") last xt.n@ pchar->str find-article 
                      source-line *help-summary bdyn[]! ;
: detail ( " xxx\n\\") last xt.n@ pchar->str find-article
                       " \detail" source-cut *help-articles bdyn[]! ;
: RUS ;
: ENG ;
