From 3f0e9c15052ed51f907bfae0bdc19b8d03d8e4c0 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Sat, 14 May 2005 21:45:37 +0000 Subject: [PATCH] Implemented first ELCode tags SVN revision: 1369 --- src/elogd.c | 355 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 318 insertions(+), 37 deletions(-) diff --git a/src/elogd.c b/src/elogd.c index 5f507fc3..ae244e75 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.660 2005/05/14 21:45:37 ritt + Implemented first ELCode tags + Revision 1.659 2005/05/14 11:14:10 ritt Version 2.5.9-4 @@ -5992,6 +5995,255 @@ void rsputs3(const char *text) /*------------------------------------------------------------------*/ +typedef struct { + char *pattern; + char *subst; +} PATTERN_LIST; + +PATTERN_LIST pattern_list[] = { + + /* smileys */ + { ":))","" }, + { ":)", "" }, + { ":(", "" }, + { ";)", "" }, + { ":D", "" }, + { "?)", "" }, + { ";(", "" }, + { ":]", "" }, + { ":O", "" }, + { "8)", "" }, + { "8o", "" }, + { "X(", "" }, + { ":P", "" }, + + /* formatting */ + { "[b]", "" }, + { "[/b]", "" }, + { "[u]", "" }, + { "[/u]", "" }, + { "[i]", "" }, + { "[/i]", "" }, + + { "[center]", "
" }, + { "[/center]", "
" }, + { "[color=", "" }, + { "[/color]", "" }, + { "[size=", "" }, + { "[/size]", "" }, + { "[code]", "" }, + { "[/code]", "" }, + + /* lists */ + { "[list]", "" }, + { "[list=", "
    " }, + + /* URLs */ + { "[url=", "" }, + { "[url]", "%s" }, + { "[/url]", "" }, + { "[email]","%s" }, + { "[/email]", "" }, + { "[img]", "" }, + { "[/img]", "" }, + + { "", "" } +}; + +void rsputs_elcode(const char *str) +{ + int i, j, k, l, m, n; + char *p, *pd, link[1000], link_text[1000], tmp[1000], attrib[256]; + + if (strlen_retbuf + (int) (2 * strlen(str) + 1000) >= return_buffer_size) { + return_buffer = xrealloc(return_buffer, return_buffer_size + 100000); + memset(return_buffer + return_buffer_size, 0, 100000); + return_buffer_size += 100000; + } + + j = strlen_retbuf; + for (i = 0; i < (int) strlen(str); i++) { + for (l = 0; key_list[l][0]; l++) { + if (strncmp(str + i, key_list[l], strlen(key_list[l])) == 0) { + p = (char *) (str + i + strlen(key_list[l])); + i += strlen(key_list[l]); + for (k = 0; *p && strcspn(p, " \t\n\r({[)}]\"") && k < (int) sizeof(link); k++, i++) + link[k] = *p++; + link[k] = 0; + i--; + + /* link may not end with a '.'/',' (like in a sentence) */ + if (link[k - 1] == '.' || link[k - 1] == ',') { + link[k - 1] = 0; + k--; + i--; + } + + /* check if link contains coloring */ + p = strchr(link, '\001'); + if (p != NULL) { + strlcpy(link_text, link, sizeof(link_text)); + + /* skip everything between '<' and '>' */ + pd = p; + while (*pd && *pd != '\002') + *p = *pd++; + + strcpy(p, pd + 1); + + /* skip '' */ + p = strchr(link, '\001'); + if (p != NULL) { + pd = p; + + while (*pd && *pd != '\002') + *p = *pd++; + + strcpy(p, pd + 1); + } + + /* correct link text */ + for (n = 0; n < (int) strlen(link_text); n++) { + switch (link_text[n]) { + /* the translation for the search highliting */ + case '\001': + link_text[n] = '<'; + break; + case '\002': + link_text[n] = '>'; + break; + case '\003': + link_text[n] = '\"'; + break; + case '\004': + link_text[n] = ' '; + break; + } + } + + } else + strlcpy(link_text, link, sizeof(link_text)); + + if (strcmp(key_list[l], "elog:") == 0) { + strlcpy(tmp, link, sizeof(tmp)); + if (strchr(tmp, '/')) + *strchr(tmp, '/') = 0; + + for (m = 0; m < (int) strlen(tmp); m++) + if (!isdigit(tmp[m])) + break; + + if (m < (int) strlen(tmp)) + /* if link contains reference to other logbook, add ".." in front */ + sprintf(return_buffer + j, "elog:%s", link, link_text); + else if (link[0] == '/') + sprintf(return_buffer + j, "elog:%s", + _current_message_id, link, link_text); + else + sprintf(return_buffer + j, "elog:%s", link, link_text); + } else if (strcmp(key_list[l], "mailto:") == 0) { + sprintf(return_buffer + j, "%s", link, link_text); + } else { + sprintf(return_buffer + j, "%s", key_list[l]); + j += strlen(return_buffer + j); + strlen_retbuf = j; + + /* link_text can contain special characters */ + rsputs2(link_text); + j = strlen_retbuf; + sprintf(return_buffer + j, ""); + } + + j += strlen(return_buffer + j); + break; + } + } + if (key_list[l][0]) + continue; + + for (l = 0; pattern_list[l].pattern[0] ; l++) { + if (strncmp(str + i, pattern_list[l].pattern, strlen(pattern_list[l].pattern)) == 0) { + + if (pattern_list[l].pattern[strlen(pattern_list[l].pattern)-1] == '=') { + i += strlen(pattern_list[l].pattern); + for (k=0 ; str[i] != ']' && k<(int)sizeof(attrib)-1; k++) + attrib[k] = str[i++]; + attrib[k] = 0; + sprintf(return_buffer + j, pattern_list[l].subst, attrib); + j += strlen(return_buffer + j); + } else { + strcpy(return_buffer + j, pattern_list[l].subst); + j += strlen(pattern_list[l].subst); + i += strlen(pattern_list[l].pattern) - 1; // 1 gets added in for loop... + } + break; + } + } + if (pattern_list[l].pattern[0]) + continue; + + if (strncmp(str + i, "
    ", 4) == 0) { + strcpy(return_buffer + j, "
    "); + j += 6; + i += 3; + } else + switch (str[i]) { + case '\n': + strcat(return_buffer, "
    "); + j += 6; + break; + case '&': + strcat(return_buffer, "&"); + j += 5; + break; + case '<': + strcat(return_buffer, "<"); + j += 4; + break; + case '>': + strcat(return_buffer, ">"); + j += 4; + break; + + /* the translation for the search highliting */ + case '\001': + strcat(return_buffer, "<"); + j++; + break; + case '\002': + strcat(return_buffer, ">"); + j++; + break; + case '\003': + strcat(return_buffer, "\""); + j++; + break; + case '\004': + strcat(return_buffer, " "); + j++; + break; + + default: + return_buffer[j++] = str[i]; + } + } + + return_buffer[j] = 0; + strlen_retbuf = j; +} + +/*------------------------------------------------------------------*/ + void rsprintf(const char *format, ...) { va_list argptr; @@ -8025,7 +8277,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL { int i, j, n, index, aindex, size, width, height, fh, length, input_size, input_maxlen, format_flags[MAX_N_ATTR], year, month, day, hour, min, sec, n_attr, n_disp_attr, - attr_index[MAX_N_ATTR]; + attr_index[MAX_N_ATTR], enc_selected; char str[2 * NAME_LENGTH], preset[2 * NAME_LENGTH], *p, *pend, star[80], comment[10000], reply_string[256], list[MAX_N_ATTR][NAME_LENGTH], file_name[256], *buffer, format[256], date[80], attrib[MAX_N_ATTR][NAME_LENGTH], *text, orig_tag[80], reply_tag[MAX_REPLY_TO * 10], @@ -8063,7 +8315,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL } /* get encoding */ - strcpy(encoding, atoi(getparam("html")) == 1 ? "HTML" : "plain"); + strcpy(encoding, getparam("encoding")); } else { if (message_id) { /* get message for reply/edit */ @@ -9231,35 +9483,45 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL rsprintf("
    \n"); - /* HTML check box */ + /* Encoding radio buttons */ + + /* Default is ELCode */ + enc_selected = 0; + /* Overwrite from config file */ + if (getcfg(lbs->name, "Default Encoding", str, sizeof(str))) + enc_selected = atoi(str); + + /* Overwrite from current entry */ if (message_id) { - if (getcfg(lbs->name, "HTML default", str, sizeof(str))) { - if (atoi(str) < 2) { - if (encoding[0] == 'H') - rsprintf("%s\n", loc("Submit as HTML text")); - else - rsprintf("%s\n", loc("Submit as HTML text")); - } else if (atoi(str) == 3) { - rsprintf("\n"); - } - } else { - if (encoding[0] == 'H') - rsprintf("%s\n", loc("Submit as HTML text")); - else - rsprintf("%s\n", loc("Submit as HTML text")); - } - } else { - if (getcfg(lbs->name, "HTML default", str, sizeof(str))) { - if (atoi(str) == 0) { - rsprintf("%s\n", loc("Submit as HTML text")); - } else if (atoi(str) == 1) { - rsprintf("%s\n", loc("Submit as HTML text")); - } else if (atoi(str) == 3) { - rsprintf("\n"); - } - } else - rsprintf("%s\n", loc("Submit as HTML text")); + if (encoding[0] == 'E') + enc_selected = 0; + else if (encoding[0] == 'p') + enc_selected = 1; + else if (encoding[0] == 'H') + enc_selected = 2; } + + rsprintf("%s: ", loc("Encoding")); + + if (enc_selected == 0) + rsprintf(""); + else + rsprintf(""); + rsprintf("\n"); + + if (enc_selected == 1) + rsprintf(""); + else + rsprintf(""); + rsprintf("\n"); + + if (enc_selected == 2) + rsprintf(""); + else + rsprintf(""); + rsprintf("\n"); + + rsprintf("
    \n"); } /* Suppress email check box */ @@ -9267,15 +9529,12 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL && atoi(str) == 1)) { if (getcfg(lbs->name, "Suppress default", str, sizeof(str))) { if (atoi(str) == 0) { - rsprintf("        \n"); rsprintf("%s\n", loc("Suppress Email notification")); } else if (atoi(str) == 1) { - rsprintf("        \n"); rsprintf("%s\n", loc("Suppress Email notification")); } } else { - rsprintf("        \n"); rsprintf("%s\n", loc("Suppress Email notification")); } } @@ -14705,7 +14964,7 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) strcat(menu_str, "Create new logbook, "); } - strcat(menu_str, "Help, "); + strcat(menu_str, "Help, HelpELCode, "); } else { /* check for admin command */ @@ -14756,7 +15015,7 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) if (str[0]) strlcat(menu_str, str, sizeof(menu_str)); else { - strlcat(menu_str, "New, Find, Select, Last x, Help, ", sizeof(menu_str)); + strlcat(menu_str, "New, Find, Select, Last x, Help, HelpELCode, ", sizeof(menu_str)); if (getcfg(lbs->name, "Password file", str, sizeof(str))) strlcat(menu_str, "Admin, Config, Logout, ", sizeof(menu_str)); @@ -16341,7 +16600,7 @@ void show_elog_list(LOGBOOK * lbs, INT past_n, INT last_n, INT page_n, char *inf strcat(menu_str, "Synchronize, "); strcpy(str, loc("Last x")); - strcat(menu_str, "Last x, Help"); + strcat(menu_str, "Last x, Help, "); } n = strbreak(menu_str, menu_item, MAX_N_LIST, ","); @@ -17828,7 +18087,7 @@ void submit_elog(LOGBOOK * lbs) message_id = el_submit(lbs, message_id, bedit, date, attr_list, attrib, n_attr, getparam("text"), in_reply_to, reply_to, - *getparam("html") ? "HTML" : "plain", att_file, TRUE, NULL); + getparam("encoding"), att_file, TRUE, NULL); if (message_id <= 0) { sprintf(str, loc("New entry cannot be written to directory \"%s\""), lbs->data_dir); @@ -18948,7 +19207,9 @@ void show_elog_entry(LOGBOOK * lbs, char *dec_path, char *command) rsputs("
    ");
                 rsputs2(text);
                 rsputs("
    "); - } else + } else if (strieq(encoding, "ELCode")) + rsputs_elcode(text); + else rsputs(text); rsputs("\n"); @@ -20829,6 +21090,26 @@ void interprete(char *lbook, char *path) return; } + if (strieq(command, loc("HelpELCode"))) { + /* send local help file */ + strlcpy(file_name, resource_dir, sizeof(file_name)); + strlcat(file_name, "elcode_", sizeof(file_name)); + if (getcfg("global", "Language", str, sizeof(str))) { + str[2] = 0; + strlcat(file_name, str, sizeof(file_name)); + } else + strlcat(file_name, "en", sizeof(file_name)); + strlcat(file_name, ".html", sizeof(file_name)); + f = fopen(file_name, "r"); + if (f == NULL) + redirect(lbs, "http://midas.psi.ch/elog/elcode_en.html"); + else { + fclose(f); + send_file_direct(file_name); + } + return; + } + if (strieq(command, loc("New"))) { show_edit_form(lbs, 0, FALSE, FALSE, FALSE, FALSE, FALSE); return;