コード例 #1
0
ファイル: wiki.c プロジェクト: OpenedHand/didiwiki
void
wiki_show_changes_page(HttpResponse *res)
{
    WikiPageList **pages = NULL;
    int            n_pages, i;

    wiki_show_header(res, "Changes", FALSE);

    pages = wiki_get_pages(&n_pages, NULL);

    for (i=0; i<n_pages; i++)
    {
        struct tm   *pTm;
        char   datebuf[64];

        pTm = localtime(&pages[i]->mtime);
        strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm);
        http_response_printf(res, "<a href='%s'>%s</a> %s<br />\n",
                             pages[i]->name,
                             pages[i]->name,
                             datebuf);
    }

    wiki_show_footer(res);
    http_response_send(res);
    exit(0);
}
コード例 #2
0
ファイル: wiki.c プロジェクト: OpenedHand/didiwiki
void
wiki_show_changes_page_rss(HttpResponse *res)
{
    WikiPageList **pages = NULL;
    int            n_pages, i;
    /*char          *html_clean_wikitext = NULL;
      char          *wikitext; */

    pages = wiki_get_pages(&n_pages, NULL);

    http_response_printf(res, "<?xml version=\"1.0\"encoding=\"ISO-8859-1\"?>\n"
                         "<rss version=\"2.0\">\n"
                         "<channel><title>DidiWiki Changes feed</title>\n");

    for (i=0; i<n_pages; i++)
    {
        struct tm   *pTm;
        char         datebuf[64];

        pTm = localtime(&pages[i]->mtime);
        strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm);

        http_response_printf(res,
                             "<item><title>%s</title>"
                             "<link>%s%s</link><description>"
                             "Modified %s\n",
                             pages[i]->name,
                             getenv("DIDIWIKI_URL_PREFIX") ? getenv("DIDIWIKI_URL_PREFIX") : "",
                             pages[i]->name,
                             datebuf);

        /*
        wikitext = file_read(pages[i]->name);
        http_response_printf_alloc_buffer(res, strlen(wikitext)*2);
        html_clean_wikitext = util_htmlize(wikitext, strlen(wikitext));
        wiki_print_data_as_html(res, html_clean_wikitext);
        */
        http_response_printf(res, "</description></item>\n");
    }

    http_response_printf(res, "</channel>\n</rss>");

    http_response_send(res);
    exit(0);
}
コード例 #3
0
ファイル: wiki.c プロジェクト: OpenedHand/didiwiki
void
wiki_show_search_results_page(HttpResponse *res, char *expr)
{
    WikiPageList **pages = NULL;
    int            n_pages, i;

    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);
    }

    pages = wiki_get_pages(&n_pages, expr);

    if (pages)
    {
        for (i=0; i<n_pages; i++)
            if (!strcmp(pages[i]->name, expr)) /* redirect on page name match */
                wiki_redirect(res, pages[i]->name);

        wiki_show_header(res, "Search", FALSE);

        for (i=0; i<n_pages; i++)
        {
            http_response_printf(res, "<a href='%s'>%s</a><br />\n",
                                 pages[i]->name,
                                 pages[i]->name);
        }
    }
    else
    {
        wiki_show_header(res, "Search", FALSE);
        http_response_printf(res, "No matches");
    }

    wiki_show_footer(res);
    http_response_send(res);

    exit(0);
}
コード例 #4
0
void wiki_show_changes_page_rss(HttpResponse *res)
{
	WikiPageList **pages = NULL;
	int            n_pages, i;

	pages = wiki_get_pages(&n_pages, NULL);

	http_response_set_content_type(res, "application/xhtml+xml");

	http_response_printf(res, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
	                     "<rss version=\"2.0\">\n"
	                     "<channel><title>DidiWiki Changes feed</title>\n");

	for (i = 0; i < n_pages; i++) {
		struct tm   *pTm;
		char         datebuf[64];

		pTm = localtime(&pages[i]->mtime);
		strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm);

		http_response_printf(res,
		                     "<item><title>%s</title>"
		                     "<link>%s%s</link><description>"
		                     "Modified %s\n",
		                     pages[i]->name,
		                     getenv("PORTABLEWIKI_URL_PREFIX") ? getenv("PORTABLEWIKI_URL_PREFIX") : "",
		                     pages[i]->name,
		                     datebuf);

		http_response_printf(res, "</description></item>\n");
	}

	http_response_printf(res, "</channel>\n</rss>");

	http_response_send(res);
	exit(0);
}
コード例 #5
0
void wiki_show_changes_page(HttpResponse *res)
{
	WikiPageList **pages = NULL;
	int n_pages, i, j, m, lg;
	char spacing[24];
	char *difflink;
	int *table, *done; //alloc mem with n_pages
	char *str_ptr;

//	wiki_show_header(res, "Changes", FALSE);

	pages = wiki_get_pages(&n_pages, NULL);

	table = malloc((1 + n_pages) * sizeof(int));
	done = malloc((1 + n_pages) * sizeof(int));
    
    http_response_set_content_type(res, "text/html");
	/* regroup file and previous file */
	for (i = 0; i < n_pages + 1; i++) {
		done[i] = 0;
		table[i] = 0;
	}
	m = 0;
	for (i = 0; i < n_pages; i++)
		if (!done[i] && !strstr(pages[i]->name, ".prev.1")) {
			for (j = 0; j < n_pages; j++)
				if (!done[j]
				    && (str_ptr = strstr(pages[j]->name, pages[i]->name))
				    &&  !strcmp(str_ptr + strlen(pages[i]->name), ".prev.1")) {
					table[m++] = i;
					table[m++] = j;
					done[i] = 1;
					done[j] = 1;
					break;
				}
		}
	/* complete with new files */
	for (i = 0; i < n_pages; i++)
		if (!done[i]) table[m++] = i;

	for (j = 0; j < m; j++) {
		struct tm   *pTm;
		char   datebuf[64];
		i = table[j];
		if (strstr(pages[i]->name, ".prev.1")) {
			strcpy(spacing, "&nbsp;&nbsp;");
			lg = asprintf(&difflink,
			              "<a href='/#/Diff/%s'>diff</a>\n"
			              "<a href='/#/Comp/%s'>comp</a>\n",
			              pages[i]->name, pages[i]->name);
		} else {
			*spacing = '\0';
			difflink = strdup("\0");
		}
		pTm = localtime(&pages[i]->mtime);
		strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm);
		http_response_printf(res, "%s<a href=/#/View/%s>%s</a> %s %s<br />\n",
		                     spacing,
		                     pages[i]->name,
		                     pages[i]->name,
		                     datebuf,
		                     difflink);
	}

	http_response_printf(res, "<p>Wiki changes are also available as a "
	                     "<a href='/rss'>RSS</a> feed.\n");

//	wiki_show_footer(res);
	http_response_send(res);
	free(table);
	free(done);
	exit(0);
}
コード例 #6
0
ファイル: wiki.c プロジェクト: OpenedHand/didiwiki
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_param_get(req, "page");

            if (page == NULL)
                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"))
        {
            char *wikitext = NULL, *page = NULL;
            if( ( (wikitext = http_request_param_get(req, "text")) != NULL)
                    && ( (page = http_request_param_get(req, "page")) != NULL))
            {
                file_write(page, wikitext);
                http_response_printf(res, "success");
                http_response_send(res);
                return;
            }
        }
        else if (!strcmp(func, "page/delete"))
        {
            char *page = http_request_param_get(req, "page");

            if (page == NULL)
                page = http_request_get_query_string(req);

            if (page && (unlink(page) > 0))
            {
                http_response_printf(res, "success");
                http_response_send(res);
                return;
            }
        }
        else if (!strcmp(func, "page/exists"))
        {
            char *page = http_request_param_get(req, "page");

            if (page == NULL)
                page = http_request_get_query_string(req);

            if (page && (access(page, R_OK) == 0))
            {
                http_response_printf(res, "success");
                http_response_send(res);
                return;
            }
        }
        else if (!strcmp(func, "pages") || !strcmp(func, "search"))
        {
            WikiPageList **pages = NULL;
            int            n_pages, i;
            char          *expr = http_request_param_get(req, "expr");

            if (expr == NULL)
                expr = http_request_get_query_string(req);

            pages = wiki_get_pages(&n_pages, expr);

            if (pages)
            {
                for (i=0; i<n_pages; i++)
                {
                    struct tm   *pTm;
                    char   datebuf[64];

                    pTm = localtime(&pages[i]->mtime);
                    strftime(datebuf, sizeof(datebuf), "%Y-%m-%d %H:%M", pTm);
                    http_response_printf(res, "%s\t%s\n", pages[i]->name, datebuf);
                }

                http_response_send(res);
                return;
            }
        }
    }

    http_response_set_status(res, 500, "Error");
    http_response_printf(res, "<html><body>Failed</body></html>\n");
    http_response_send(res);

    return;
}