27 #define AWAR_HELP "tmp/help/"
28 #define AWAR_HELPFILE AWAR_HELP "file"
29 #define AWAR_HELPTEXT AWAR_HELP "text"
30 #define AWAR_HELPSEARCH AWAR_HELP "search"
36 size_t len = strlen(command);
40 async.
ncat(command, len);
60 freeset(browser, new_browser);
83 size_t user_doc_path_len = strlen(user_doc_path);
84 size_t devel_doc_path_len = strlen(devel_doc_path);
86 const char *rel_path =
NULp;
87 if (strncmp(helpfile, user_doc_path, user_doc_path_len) == 0 && helpfile[user_doc_path_len] ==
'/') {
88 rel_path = helpfile+user_doc_path_len+1;
90 else if (strncmp(helpfile, devel_doc_path, devel_doc_path_len) == 0 && helpfile[devel_doc_path_len] ==
'/') {
92 rel_path = helpfile+devel_doc_path_len+1;
95 if (helpfile[0]==
'/' && !rel_path) {
99 if (!rel_path) rel_path = helpfile;
112 aw_assert(devel_size <= 0 || gen_size <= 0);
137 free(devel_doc_path);
139 return strdup(result);
153 size_t user_doc_path_len = strlen(user_doc_path);
156 if (strncmp(helpfile, user_doc_path, user_doc_path_len) == 0) {
158 size_t result_len = strlen(result);
162 if (strcmp(result+result_len-5,
".hlp_") == 0) {
163 strcpy(result+result_len-5,
".html");
180 static void store_helpfile_in_tarball(
const char *path,
const char *mode) {
189 error =
"Unexpected helpfile name (in store_helpfile_in_tarball)";
194 static void aw_helpfile_modified_cb(
const char *path) {
195 static enum { UNMODIFIED, MODIFIED, NOTIFIED } state = UNMODIFIED;
197 store_helpfile_in_tarball(path,
"end");
198 if (state == UNMODIFIED) state = MODIFIED;
200 if (state == MODIFIED) {
201 aw_message(
"Your changes to ARB help have been stored in an archive.\n"
202 "See console for what to send to ARB developers!");
230 store_helpfile_in_tarball(helpfile,
"start");
233 aw_message(
"Warning: you do not have the permission to save changes to that helpfile\n"
234 "(ask your admin to gain write access)");
237 AW_edit_notified(helpfile, makeFileChangedCallback(aw_helpfile_modified_cb));
246 if (!ref)
return NULp;
262 if (strcmp(file, result)==0) freenull(result);
270 result = strdup(ref);
279 const char *sep = strchr(history,
'#');
280 char *lastHelp = sep ?
ARB_strpartdup(history, sep-1) : strdup(history);
293 const char *sep = strchr(history,
'#');
311 if (entries.
size()) {
318 HELP.uplinks->clear();
321 for (
size_t i = 0; i<entries.
size(); ++i) {
323 HELP.links->insert(title, entries[i]);
327 HELP.uplinks->insert_default(
" ",
"");
HELP.uplinks->update();
328 HELP.links ->insert_default(
" ",
"");
HELP.links ->update();
348 if (stat(help_file, &st) == 0) {
354 if (stat(compressed, &st) == 0) {
365 "(gunzip <%s >%s ; %s %s ; rm %s) &",
366 compressed, uncompressed,
367 viewer, uncompressed,
382 if (sys[0] && !error) error =
GBK_system(sys);
388 # define TRACK_HELPFILE
392 #if defined(TRACK_HELPFILE)
395 static bool track_helpfile =
false;
396 static unsigned long helpfile_stamp = 0;
397 static unsigned long helpfile_edited_stamp = 0;
399 const unsigned TRACK_FREQUENCY = 500;
401 static unsigned autorefresh_helpfile(
AW_root *awr) {
403 unsigned callAgainIn = TRACK_FREQUENCY;
408 if (lastChanged != helpfile_stamp) {
410 aw_assert(helpfile_stamp == lastChanged);
412 #if defined(AUTOBUILD_CHANGED_HELPFILE)
415 if (strcmp(help_file, edited_help_file) != 0) {
418 if (editLastChanged>helpfile_edited_stamp) {
420 helpfile_edited_stamp = editLastChanged;
425 free(edited_help_file);
439 #if defined(TRACK_HELPFILE)
440 track_helpfile =
false;
443 if (!strlen(help_file)) {
445 "press the BACK button above.");
459 if (strncmp(help_file,
HELP.history, strlen(help_file)) != 0) {
465 freeset(
HELP.history, h);
470 HELP.history = strdup(help_file);
473 #if defined(TRACK_HELPFILE)
474 track_helpfile =
true;
483 ptr = strdup(helptext);
484 HELP.uplinks->clear();
488 tok = strtok(h+3,
" \n\t");
490 if (tok)
HELP.uplinks->insert(title, tok);
494 HELP.uplinks->insert_default(
" ",
"");
495 HELP.uplinks->update();
497 ptr = strdup(helptext);
502 tok = strtok(h+4,
" \n\t");
504 if (tok)
HELP.links->insert(title, tok);
508 HELP.links->insert_default(
" ",
"");
509 HELP.links->update();
512 if (!ptr) ptr = helptext;
521 "Please help us to complete the ARB-Help by submitting\n"
522 "this missing helplink via ARB_NT/File/About/SubmitBug\n"
550 if (searchtext[0]==0) error =
"Empty searchstring";
552 char *helpfilename =
NULp;
553 static char *last_help;
563 const char *existingSearch = (
const char*)
GBS_read_hash(searchHash, searchtext);
564 if (existingSearch) {
565 helpfilename = strdup(existingSearch);
577 const char *gen_help_tmpl =
"cd %s;grep -i %s `find . -name \"*.hlp\"` | arb_sed -e 'sI:.*IIg' -e 'sI^\\./IIg' | sort | uniq > %s";
578 char *gen_help_cmd =
GBS_global_string_copy(gen_help_tmpl, quotedDocpath, quotedSearchExpression, helpfilename);
584 free(quotedSearchExpression);
595 FILE *helpfp = fopen(helpfilename,
"wt");
598 fprintf(helpfp,
"\nUP arb.hlp\n");
599 if (last_help) fprintf(helpfp,
"UP %s\n", last_help);
605 char *
eol = strchr(rp,
'\n');
613 fprintf(helpfp,
"SUB %s\n", rp);
617 if (eol[0]==0)
break;
621 fprintf(helpfp,
"\nTITLE\t\tResult of search for '%s'\n\n", searchtext);
622 if (results>0) fprintf(helpfp,
"\t\t%i results are shown as subtopics\n", results);
623 else fprintf(helpfp,
"\t\tThere are no results.\n");
625 if (results>0) freedup(last_help, helpfilename);
631 GBS_write_hash(searchHash, searchtext, (
long)strdup(helpfilename));
643 static AW_window_simple *aws =
NULp;
653 aws =
new AW_window_simple;
654 aws->reset_layout(
"20251113");
655 aws->init(awr,
"HELP",
"HELP WINDOW");
656 aws->load_xfig(
"help.fig");
658 aws->button_length(9);
659 aws->auto_space(5, 5);
663 aws->create_button(
"CLOSE",
"CLOSE",
"C");
666 aws->create_button(
"BACK",
"BACK",
"B");
669 aws->create_button(
"HISTORY",
"HISTORY",
"H");
671 aws->at(
"expression");
675 aws->create_button(
"SEARCH",
"SEARCH",
"S",
"+");
679 aws->create_button(
"BROWSE",
"BROWSE",
"B");
682 aws->create_button(
"EDIT",
"EDIT",
"E");
686 HELP.uplinks->insert_default(
" ",
"");
687 HELP.uplinks->update();
691 HELP.links->insert_default(
" ",
"");
692 HELP.links->update();
698 #if defined(TRACK_HELPFILE)
GB_ERROR GBK_system(const char *system_command)
static void aw_help_back(AW_window *aww)
void GB_remove_on_exit(const char *filename)
static void aw_help_helpfile_changed_cb(AW_root *awr)
long GBS_write_hash(GB_HASH *hs, const char *key, long val)
static GB_ERROR aw_help_show_external_format(const char *help_file, const char *viewer)
const char * GBS_global_string_to_buffer(char *buffer, size_t bufsize, const char *templat,...)
void AW_edit(const char *path)
static void aw_help_browse(AW_window *aww)
static const char * develDocPath()
static void aw_help_select_newest_in_history(AW_root *aw_root)
void AW_edit_notified(const char *path, const FileChangedCallback &callback)
GB_ERROR GB_export_IO_error(const char *action, const char *filename)
const char * GBS_global_string(const char *templat,...)
GB_HASH * GBS_create_dynaval_hash(long estimated_elements, GB_CASE case_sens, void(*freefun)(long))
char * GBS_string_eval(const char *insource, const char *icommand)
void AW_POPDOWN(AW_window *window)
void add_timed_callback(int ms, const TimedCallback &tcb)
char * ARB_strpartdup(const char *start, const char *end)
long GB_size_of_file(const char *path)
GB_CSTR GB_getenvARB_GS(void)
GB_CSTR GBS_find_string(GB_CSTR cont, GB_CSTR substr, int match_mode)
AW_awar * add_callback(const RootCallback &cb)
struct Unfixed_cb_parameter * UNFIXED
static HelixNrInfo * start
const char * read_char_pntr() const
void AW_system(const char *command)
GB_ERROR GB_export_error(const char *error)
GB_ERROR GB_await_error()
static AW_root * SINGLETON
char * GB_create_tempfile(const char *name)
static char * get_local_help_url(AW_root *awr)
unsigned long GB_time_of_file(const char *path)
static void aw_help_search(AW_window *aww)
static void error(const char *msg)
GB_CSTR GB_path_in_ARBHOME(const char *relative_path)
GB_CSTR GB_getenvHTMLDOCPATH(void)
GB_CSTR GB_getenvDOCPATH(void)
static void aw_help_history(AW_window *aww)
void GBS_dynaval_free(long val)
char * read_string() const
AW_awar * awar(const char *awar)
void AW_system_async(const char *command)
AW_selection_list * links
bool GB_is_writeablefile(const char *filename)
static char * aw_ref_to_title(const char *ref)
char * GB_unique_filename(const char *name_prefix, const char *suffix)
void ncat(const char *from, size_t count)
char * GBK_singlequote(const char *arg)
bool GB_is_directory(const char *path)
GB_CSTR GB_getenvARB_PDFVIEW(void)
const char * GBS_static_string(const char *str)
void aw_message(const char *msg)
void GB_split_full_path(const char *fullpath, char **res_dir, char **res_fullname, char **res_name_only, char **res_suffix)
bool GB_is_regularfile(const char *path)
static void aw_help_edit_help(AW_window *aww)
void AW_help_popup(UNFIXED, const char *help_file)
GB_ERROR write_string(const char *aw_string)
void GBT_split_string(ConstStrArray &dest, const char *namelist, const char *separator, SplitMode mode)
static char * get_full_qualified_help_file_name(const char *helpfile, bool path_for_edit=false)
bool ARB_strBeginsWith(const char *str, const char *with)
const char * get_data() const
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
bool GBS_string_matches(const char *str, const char *expr, GB_CASE case_sens)
GB_CSTR GB_getenvARB_XTERM(void)
void AW_openURL(AW_root *aw_root, const char *url)
long GBS_read_hash(const GB_HASH *hs, const char *key)
AW_selection_list * uplinks
void aw_message_if(GB_ERROR error)
char * GBS_global_string_copy(const char *templat,...)
char * GB_read_file(const char *path)