[PATCH] Cleanup svn
src/wiki.c.orig shouldn't have been put under version control. Deleted.
Signed-off-by: Peter Korsgaard ",
- 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");
- line++;
-
- 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");
-
- table_on = 1;
- goto line_content;
- }
- else
- {
- if(table_on)
- {
- http_response_printf(res, "
\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; iRedirect 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; i