[PATCH] Cleanup svn src/wiki.c.orig shouldn't have been put under version control. Deleted. Signed-off-by: Peter Korsgaard --- src/wiki.c.orig | 1068 -------------------------------------------------------- 1 file changed, 1068 deletions(-) Index: didiwiki/src/wiki.c.orig =================================================================== --- didiwiki.orig/src/wiki.c.orig +++ /dev/null @@ -1,1068 +0,0 @@ -/* - * DidiWiki - a small lightweight wiki engine. - * - * Copyright 2004 Matthew Allum - * - * This program 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 2, or (at your option) - * any later version. - * - * This program 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. - */ - -#include "didi.h" -#include "wikitext.h" - -static char* CssData = STYLESHEET; - -static char * -get_line_from_string(char **lines, int *line_len) -{ - int i; - char *z = *lines; - - if( z[0] == '\0' ) return NULL; - - for (i=0; z[i]; i++) - { - if (z[i] == '\n') - { - if (i > 0 && z[i-1]=='\r') - { z[i-1] = '\0'; } - else - { z[i] = '\0'; } - i++; - break; - } - } - - /* advance lines on */ - *lines = &z[i]; - *line_len -= i; - - return z; -} - -static char* -check_for_link(char *line, int *skip_chars) -{ - char *start = line; - char *p = line; - char *url = NULL; - char *title = NULL; - char *result = NULL; - char tmp; - int found = 0; - - if (*p == '[') /* [ link [title] ] */ - { - /* XXX TODO XXX - * Allow links like [the Main page] ( covert to the_main_page ) - * - * - */ - - - url = start+1; *p = '\0'; p++; - while ( *p != ']' && *p != '\0' && !isspace(*p) ) p++; - - if (isspace(*p)) - { - *p = '\0'; - title = ++p; - while ( *p != ']' && *p != '\0' ) - p++; - } - - *p = '\0'; - p++; - } - else if (!strncasecmp(p, "http://", 7) - || !strncasecmp(p, "mailto://", 9) - || !strncasecmp(p, "file://", 7)) - { - while ( *p != '\0' && !isspace(*p) ) p++; - - - found = 1; - } - else if (isupper(*p)) /* Camel-case */ - { - int num_upper_char = 1; - p++; - while ( *p != '\0' && isalnum(*p) ) - { - if (isupper(*p)) - { found = 1; num_upper_char++; } - p++; - } - - if (num_upper_char == (p-start)) /* Dont make ALLCAPS links */ - return NULL; - } - - if (found) /* cant really set http/camel links in place */ - { - url = malloc(sizeof(char) * ((p - start) + 2) ); - memset(url, 0, sizeof(char) * ((p - start) + 2)); - strncpy(url, start, p - start); - *start = '\0'; - } - - if (url != NULL) - { - int len = strlen(url); - - *skip_chars = p - start; - - /* is it an image ? */ - if (!strncmp(url+len-4, ".gif", 4) || !strncmp(url+len-4, ".png", 4) - || !strncmp(url+len-4, ".jpg", 4) || !strncmp(url+len-5, ".jpeg", 5)) - { - if (title) - asprintf(&result, "", - title, url); - else - asprintf(&result, "", url); - } - else - { - char *extra_attr = NULL; - - if (!strncasecmp(url, "http://", 7)) - extra_attr = " title='WWW link' "; - - if (title) - asprintf(&result,"%s", extra_attr, url, title); - else - asprintf(&result, "%s", extra_attr, url, url); - } - - - - return result; - } - - return NULL; -} - - -static char * -file_read(char *filename) -{ - struct stat st; - FILE* fp; - char* str; - int len; - - /* Get the file size. */ - if (stat(filename, &st)) - return NULL; - - if (!(fp = fopen(filename, "rb"))) - return NULL; - - str = (char *)malloc(sizeof(char)*(st.st_size + 1)); - len = fread(str, 1, st.st_size, fp); - if (len >= 0) str[len] = '\0'; - - fclose(fp); - - return str; -} - - -static int -file_write(char *filename, char *data) -{ - FILE* fp; - int bytes_written = 0; - int len = strlen(data)+1; - - if (!(fp = fopen(filename, "wb"))) - return -1; - - while ( len > 0 ) - { - bytes_written = fwrite(data, sizeof(char), len, fp); - len = len - bytes_written; - data = data + bytes_written; - } - - fclose(fp); - - return 1; -} - -static int -is_wiki_format_char_or_space(char c) -{ - if (isspace(c)) return 1; - if (strchr("/*_-", c)) return 1; - return 0; -} - -void -wiki_print_data_as_html(HttpResponse *res, char *raw_page_data) -{ - char *p = raw_page_data; /* accumalates non marked up text */ - char *q = NULL, *url = NULL, *link = NULL; /* temporary scratch stuff */ - char *line = NULL; - int line_len; - int i, j, skip_chars; - - /* flags, mainly for open tag states */ - int bold_on = 0; - int italic_on = 0; - int underline_on = 0; - int strikethrough_on = 0; - int open_para = 0; - int pre_on = 0; - int list_depth = 0; - int table_on = 0; - -#define ULIST 0 -#define OLIST 1 -#define NUM_LIST_TYPES 2 - - struct { char ident; int depth; char *tag; } listtypes[] = { - { '*', 0, "ul" }, - { '#', 0, "ol" } - }; - - - q = p; /* p accumalates non marked up text, q is just a pointer - * to the end of the current line - used by below func. - */ - - while ( (line = get_line_from_string(&q, &line_len)) ) - { - int header_level = 0; - char *line_start = line; - int skip_to_content = 0; - /* - * process any initial wiki chars at line beginning - */ - - if (pre_on && !isspace(*line) && *line != '\0') - { - /* close any preformatting if already on*/ - http_response_printf(res, "\n\n") ; - pre_on = 0; - } - - /* Handle ordered & unordered list, code is a bit mental.. */ - for (i=0; i\n", listtypes[!i].tag); - listtypes[!i].depth = 0; - } - - while ( *line == listtypes[i].ident ) { line++; item_depth++; } - - if (item_depth < listtypes[i].depth) - { - for (j = 0; j < (listtypes[i].depth - item_depth); j++) - http_response_printf(res, "\n", listtypes[i].tag); - } - else - { - for (j = 0; j < (item_depth - listtypes[i].depth); j++) - http_response_printf(res, "<%s>\n", listtypes[i].tag); - } - - http_response_printf(res, "
  • "); - - listtypes[i].depth = item_depth; - - skip_to_content = 1; - } - else if (listtypes[i].depth && !listtypes[!i].depth) - { - /* close current list */ - - for (j=0; j\n", listtypes[i].tag); - listtypes[i].depth = 0; - } - } - - if (skip_to_content) - goto line_content; /* skip parsing any more initial chars */ - - /* Tables */ - - if (*line == '|') - { - if (table_on==0) - http_response_printf(res, "\n"); - line++; - - http_response_printf(res, "
    "); - - table_on = 1; - goto line_content; - } - else - { - if(table_on) - { - http_response_printf(res, "
    \n"); - table_on = 0; - } - } - - /* pre formated */ - - if ( (isspace(*line) || *line == '\0')) - { - int n_spaces = 0; - - while ( isspace(*line) ) { line++; n_spaces++; } - - if (*line == '\0') /* empty line - para */ - { - if (pre_on) - { - http_response_printf(res, "\n") ; - continue; - } - else if (open_para) - { - http_response_printf(res, "\n

    \n") ; - } - else - { - http_response_printf(res, "\n

    \n") ; - open_para = 1; - } - } - else /* starts with space so Pre formatted, see above for close */ - { - if (!pre_on) - http_response_printf(res, "

    \n") ;
    -	      pre_on = 1;
    -	      line = line - ( n_spaces - 1 ); /* rewind so extra spaces
    -                                                 they matter to pre */
    -	      http_response_printf(res, "%s\n", line);
    -	      continue;
    -	    }
    -	}
    -      else if ( *line == '=' )
    -	{
    -	  while (*line == '=')
    -	    { header_level++; line++; }
    -
    -	  http_response_printf(res, "", header_level);
    -	  p = line;
    -	}
    -      else if ( *line == '-' && *(line+1) == '-' )
    -	{
    -	  /* rule */
    -	  http_response_printf(res, "
    \n"); - while ( *line == '-' ) line++; - } - - line_content: - - /* - * now process rest of the line - */ - - p = line; - - while ( *line != '\0' ) - { - if ( *line == '!' && !isspace(*(line+1))) - { /* escape next word - skip it */ - *line = '\0'; - http_response_printf(res, "%s", p); - p = ++line; - - while (*line != '\0' && !isspace(*line)) line++; - if (*line == '\0') - continue; - } - else if ((link = check_for_link(line, &skip_chars)) != NULL) - { - http_response_printf(res, "%s", p); - http_response_printf(res, "%s", link); - - line += skip_chars; - p = line; - - continue; - - } - /* TODO: Below is getting bloated and messy, need rewriting more - * compactly ( and efficently ). - */ - else if (*line == '*') - { - /* Try and be smart about what gets bolded */ - if (line_start != line - && !is_wiki_format_char_or_space(*(line-1)) - && !bold_on) - { line++; continue; } - - if ((isspace(*(line+1)) && !bold_on)) - { line++; continue; } - - /* bold */ - *line = '\0'; - http_response_printf(res, "%s%s\n", p, bold_on ? "" : ""); - bold_on ^= 1; /* reset flag */ - p = line+1; - - } - else if (*line == '_' ) - { - if (line_start != line - && !is_wiki_format_char_or_space(*(line-1)) - && !underline_on) - { line++; continue; } - - if (isspace(*(line+1)) && !underline_on) - { line++; continue; } - /* underline */ - *line = '\0'; - http_response_printf(res, "%s%s\n", p, underline_on ? "" : ""); - underline_on ^= 1; /* reset flag */ - p = line+1; - } - else if (*line == '-') - { - if (line_start != line - && !is_wiki_format_char_or_space(*(line-1)) - && !strikethrough_on) - { line++; continue; } - - if (isspace(*(line+1)) && !strikethrough_on) - { line++; continue; } - - /* strikethrough */ - *line = '\0'; - http_response_printf(res, "%s%s\n", p, strikethrough_on ? "" : ""); - strikethrough_on ^= 1; /* reset flag */ - p = line+1; - - - } - else if (*line == '/' ) - { - if (line_start != line - && !is_wiki_format_char_or_space(*(line-1)) - && !underline_on) - { line++; continue; } - - if (isspace(*(line+1)) && !underline_on) - { line++; continue; } - - /* crude path detection */ - if (line_start != line && isspace(*(line-1)) && !underline_on) - { - char *tmp = line+1; - int slashes = 0; - - /* Hack to escape out file paths */ - while (*tmp != '\0' && !isspace(*tmp)) - { - if (*tmp == '/') slashes++; - tmp++; - } - - if (slashes > 1 || (slashes == 1 && *(tmp-1) != '/')) - { line = tmp; continue; } - } - - if (*(line+1) == '/') - line++; /* escape out common '//' - eg urls */ - else - { - /* italic */ - *line = '\0'; - http_response_printf(res, "%s%s\n", p, underline_on ? "" : ""); - underline_on ^= 1; /* reset flag */ - p = line+1; - } - } - else if (*line == '|' && table_on) /* table column */ - { - *line = '\0'; - http_response_printf(res, p); - http_response_printf(res, "\n"); - p = line+1; - } - - line++; - - } /* next word */ - - if (*p != '\0') /* accumalated text left over */ - http_response_printf(res, "%s", p); - - /* close any html tags that could be still open */ - - - if (listtypes[ULIST].depth) - http_response_printf(res, "
  • "); - - if (listtypes[OLIST].depth) - http_response_printf(res, ""); - - if (table_on) - http_response_printf(res, "\n"); - - if (header_level) - http_response_printf(res, "\n", header_level); - else - http_response_printf(res, "\n"); - - - } /* next line */ - - /* clean up anything thats still open */ - - if (pre_on) - http_response_printf(res, "\n"); - - /* close any open lists */ - for (i=0; i\n"); - - for (i=0; i\n"); - - /* close any open paras */ - if (open_para) - http_response_printf(res, "

    \n"); - - /* tables */ - if (table_on) - http_response_printf(res, "\n"); - -} - -int -wiki_redirect(HttpResponse *res, char *location) -{ - char *header = alloca(strlen(location) + 14); - - sprintf(header, "Location: %s\r\n", location); - - http_response_append_header(res, header); - http_response_printf(res, "\n

    Redirect to %s

    \n\n", - location); - http_response_set_status(res, 302, "Moved Temporarily"); - http_response_send(res); - - exit(0); -} - - -void -wiki_show_page(HttpResponse *res, char *wikitext, char *page) -{ - char *html_clean_wikitext = NULL; - - http_response_printf_alloc_buffer(res, strlen(wikitext)*2); - - wiki_show_header(res, page, TRUE); - - html_clean_wikitext = util_htmlize(wikitext, strlen(wikitext)); - - wiki_print_data_as_html(res, html_clean_wikitext); - - wiki_show_footer(res); - - http_response_send(res); - - exit(0); - -} - -void -wiki_show_edit_page(HttpResponse *res, char *wikitext, char *page) -{ - wiki_show_header(res, page, FALSE); - - if (wikitext == NULL) wikitext = ""; - http_response_printf(res, EDITFORM, page, wikitext); - - wiki_show_footer(res); - - http_response_send(res); - exit(0); -} - -void -wiki_show_create_page(HttpResponse *res) -{ - wiki_show_header(res, "Create New Page", FALSE); - http_response_printf(res, CREATEFORM); - wiki_show_footer(res); - - http_response_send(res); - exit(0); -} - -static int -changes_compar(const struct dirent **d1, const struct dirent **d2) -{ - struct stat st1, st2; - - stat((*d1)->d_name, &st1); - - stat((*d2)->d_name, &st2); - - if (st1.st_mtime > st2.st_mtime) - return 1; - else - return -1; -} - - - -void -wiki_get_pages(WikiPageList **pages, int *n_pages) -{ - struct dirent **namelist; - int n, i = 0; - WikiPageList *page; - struct stat st; - - n = scandir(".", &namelist, 0, (void *)changes_compar); - - pages = malloc(sizeof(WikiPageList*)*n); - - while(n--) - { - if ((namelist[n]->d_name)[0] == '.' - || !strcmp(namelist[n]->d_name, "styles.css")) - goto cleanup; - - stat(namelist[n]->d_name, &st); - - pages[i] = malloc(sizeof(WikiPageList)); - pages[i]->name = strdup (namelist[n]->d_name); - pages[i]->mtime = st.st_mtime; - - i++; - - cleanup: - free(namelist[n]); - } - - *n_pages = i; - - free(namelist); -} - -void -wiki_show_changes_page(HttpResponse *res) -{ - WikiPageList **pages; - int n_pages, i; - - wiki_show_header(res, "Changes", FALSE); - - wiki_get_pages(pages, &n_pages); - - for (i=0; imtime); - strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm); - http_response_printf(res, "%s %s
    \n", - pages[i]->name, - pages[i]->name, - datebuf); - } - - wiki_show_footer(res); - http_response_send(res); - exit(0); -} - - - -#if 0 -void -wiki_show_changes_page(HttpResponse *res) -{ - struct dirent **namelist; - int n; - - wiki_show_header(res, "Changes", FALSE); - - n = scandir(".", &namelist, 0, (void *)changes_compar); - - /* - if (n < 0) TODO error - */ - - while(n--) - { - struct stat st; - struct tm *pTm; - char datebuf[64]; - - if ((namelist[n]->d_name)[0] == '.' - || !strcmp(namelist[n]->d_name, "styles.css")) - goto cleanup; - - stat(namelist[n]->d_name, &st); - - pTm = localtime(&st.st_mtime); - strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm); - http_response_printf(res, "%s %s
    \n", - namelist[n]->d_name, - namelist[n]->d_name, - datebuf); - cleanup: - free(namelist[n]); - } - - free(namelist); - - wiki_show_footer(res); - http_response_send(res); - exit(0); - -} -#endif - -void -wiki_show_search_results_page(HttpResponse *res, char *expr) -{ - struct dirent **namelist; - int n, i, finds = 0; - - if (expr == NULL || strlen(expr) == 0) - { - wiki_show_header(res, "Search", FALSE); - http_response_printf(res, "No Search Terms supplied"); - wiki_show_footer(res); - http_response_send(res); - exit(0); - } - - i = n = scandir(".", &namelist, 0, 0); - - while(i--) - { - if ((namelist[i]->d_name)[0] == '.' - || !strcmp(namelist[i]->d_name, "styles.css")) - continue; - - if (!strcmp(namelist[i]->d_name, expr)) - wiki_redirect(res, namelist[i]->d_name); /* exits */ - } - - i = n; - - wiki_show_header(res, "Search", FALSE); - - - while(i--) - { - char *data = NULL; - - if ((namelist[i]->d_name)[0] == '.' - || !strcmp(namelist[i]->d_name, "styles.css")) - goto cleanup; - - /* Super simple search functionality TODO Improve */ - - if ((data = file_read(namelist[i]->d_name)) != NULL) - { - if (strstr(data, expr)) - { - http_response_printf(res, "%s
    \n", - namelist[i]->d_name, - namelist[i]->d_name); - finds++; - } - } - - if (data) free(data); - - cleanup: - free(namelist[i]); - } - - if (!finds) - http_response_printf(res, "No matches"); - - free(namelist); - - wiki_show_footer(res); - http_response_send(res); - - exit(0); -} - -void -wiki_show_header(HttpResponse *res, char *page_title, int want_edit) -{ - http_response_printf(res, - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "%s\n" - - "\n" - "\n", page_title - ); - - http_response_printf(res, PAGEHEADER, page_title, - (want_edit) ? " ( Edit ) " : "" ); -} - -void -wiki_show_footer(HttpResponse *res) -{ - http_response_printf(res, PAGEFOOTER); - - http_response_printf(res, - "\n" - "\n" - ); -} - -void -wiki_handle_rest_call(HttpRequest *req, - HttpResponse *res, - char *func) -{ - - if (func != NULL && *func != '\0') - { - if (!strcmp(func, "page/get")) - { - char *page = http_request_get_query_string(req); - - if (page && (access(page, R_OK) == 0)) - { - http_response_printf(res, "%s", file_read(page)); - http_response_send(res); - return; - } - } - else if (!strcmp(func, "page/set")) - { - - return; - } - else if (!strcmp(func, "page/delete")) - { - - return; - } - else if (!strcmp(func, "page/exists")) - { - - return; - } - else if (!strcmp(func, "pages")) - { - - return; - } - else if (!strcmp(func, "search")) - { - - return; - } - } - - http_response_set_status(res, 404, "Not Found"); - http_response_printf(res, "Not Found\n"); - http_response_send(res); - - return; -} - - - -void -wiki_handle_http_request(HttpRequest *req) -{ - HttpResponse *res = http_response_new(req); - char *page = http_request_get_path_info(req); - char *command = http_request_get_query_string(req); - char *wikitext = ""; - - util_dehttpize(page); /* remove any encoding on the requested - page name. */ - - if (!strcmp(page, "/")) - { - if (access("WikiHome", R_OK) != 0) - wiki_redirect(res, "/WikiHome?create"); - page = "/WikiHome"; - } - - if (!strcmp(page, "/styles.css")) - { - /* Return CSS page */ - http_response_set_content_type(res, "text/css"); - http_response_printf(res, CssData); - http_response_send(res); - exit(0); - } - - if (!strcmp(page, "/favicon.ico")) - { - /* Return favicon */ - http_response_set_content_type(res, "image/ico"); - http_response_set_data(res, FaviconData, FaviconDataLen); - http_response_send(res); - exit(0); - } - - - page = page + 1; /* skip slash */ - - if (!strncmp(page, "api/", 4)) - { - char *p; - - page += 4; - for (p=page; *p != '\0'; p++) - if (*p=='?') { *p ='\0'; break; } - - wiki_handle_rest_call(req, res, page); - exit(0); - } - - if (!strcmp(page, "Changes")) - { - /* TODO list recent changes */ - wiki_show_changes_page(res); - } - else if (!strcmp(page, "Search")) - { - wiki_show_search_results_page(res, http_request_param_get(req, "expr")); - } - else if (!strcmp(page, "Create")) - { - char *new_page; - if ( (wikitext = http_request_param_get(req, "title")) != NULL) - { - /* create page and redirect */ - wiki_redirect(res, http_request_param_get(req, "title")); - } - else - { - /* show create page form */ - wiki_show_create_page(res); - } - } - else - { - /* TODO: dont blindly write wikitext data to disk */ - if ( (wikitext = http_request_param_get(req, "wikitext")) != NULL) - { - file_write(page, wikitext); - } - - if (access(page, R_OK) == 0) /* page exists */ - { - wikitext = file_read(page); - - if (!strcmp(command, "edit")) - { - /* print edit page */ - wiki_show_edit_page(res, wikitext, page); - } - else - { - wiki_show_page(res, wikitext, page); - } - } - else - { - if (!strcmp(command, "create")) - { - wiki_show_edit_page(res, NULL, page); - } - else - { - char buf[1024]; - snprintf(buf, 1024, "%s?create", page); - wiki_redirect(res, buf); - } - } - } - -} - -int -wiki_init(void) -{ - char datadir[512] = { 0 }; - struct stat st; - - if (getenv("DIDIWIKIHOME")) - { - snprintf(datadir, 512, getenv("DIDIWIKIHOME")); - } - else - { - if (getenv("HOME") == NULL) - { - fprintf(stderr, "Unable to get home directory, is HOME set?\n"); - exit(1); - } - - snprintf(datadir, 512, "%s/.didiwiki", getenv("HOME")); - } - - /* Check if ~/.didiwiki exists and create if not */ - if (stat(datadir, &st) != 0 ) - { - if (mkdir(datadir, 0755) == -1) - { - fprintf(stderr, "Unable to create '%s', giving up.\n"); - exit(1); - } - } - - chdir(datadir); - - /* Write Default Help + Home page if it doesn't exist */ - - if (access("WikiHelp", R_OK) != 0) - file_write("WikiHelp", HELPTEXT); - - if (access("WikiHome", R_OK) != 0) - file_write("WikiHome", HOMETEXT); - - /* Read in optional CSS data */ - - if (access("styles.css", R_OK) == 0) - CssData = file_read("styles.css"); - - -} -