int WikiManage::wiki_parse_url_full_search(const char *url, char *flag, char *title, char **data) { full_search_t *fs = &m_search_buf; int size, i = atoi(url); struct one_lang *p = wiki_full_search_find_lang(i); strcpy(flag, "1"); strcpy(title, fs->key); if (p == NULL) return wiki_not_found(data, &size, "Not Found."); int len; sort_idx_t idx; if (p->index->wi_find(NULL, WK_INDEX_FIND, fs->page_idx[i], &idx, &len) == 0) { if ((len = p->data->wd_sys_read(idx.data_file_idx, idx.data_pos, idx.data_len, m_curr_content, _MAX_ONE_PAGE_SIZE)) > 0) { m_curr_content[len] = 0; if (m_wiki_config->wc_get_audio_flag()) { len = wiki_parse_audio_flag(m_curr_content, len, m_curr_page); memcpy(m_curr_content, m_curr_page, len); m_curr_content[len] = 0; } if (m_wiki_config->wc_get_need_translate()) { len = wiki_translate_format(m_curr_content, len, m_curr_page); memcpy(m_curr_content, m_curr_page, len); m_curr_content[len] = 0; } int size = convert_page_simple(m_curr_page, m_curr_content, len, fs->key); m_curr_page[size] = 0; char tmp[256]; p->index->wi_get_key(&idx, tmp); m_curr_lang = p; wiki_push_back(STATUS_CONTENT, tmp, len, &idx); return wiki_not_found(data, &size, m_curr_page, size); } } return wiki_not_found(data, &size, "Not Found."); }
int WikiManage::wiki_read_data(const sort_idx_t *p, char **buf, const char *title) { char tmp[256]; const char *key = tmp; int n, pos, height; WikiData *wiki_data = CURR_WIKI(data); WikiIndex *wiki_index = CURR_WIKI(index); INIT_CURR_TITLE(); if ((n = wiki_data->wd_sys_read((int)p->data_file_idx, p->data_pos, (int)p->data_len, m_curr_content, 2*1024*1024)) > 0) { #if 0 n = m_wiki_zh->wz_convert_2hans(m_curr_content, n, m_curr_page); memcpy(m_curr_content, m_curr_page, n); m_curr_content[n] = 0; #endif m_curr_content[n] = 0; if (m_wiki_config->wc_get_need_translate()) { n = wiki_translate_format(m_curr_content, n, m_curr_page); memcpy(m_curr_content, m_curr_page, n); m_curr_content[n] = 0; } int split_total = wiki_split_content(n); if (title == NULL) { wiki_index->wi_get_key(p, tmp); } else { key = title; } SET_CURR_TITLE(key); wiki_find_key_pos(&pos, &height); int len; char bg[16], fg[16], link[16], bg_str[64]; int font_size; m_wiki_config->wc_get_config(bg, fg, link, &font_size); sprintf(bg_str, "background:%s;\n", bg); /* TODO WIKI_START_HTML */ len = sprintf(m_curr_page, WIKI_START_HTML, m_wiki_config->wc_get_body_image_flag() ? "" : bg_str , fg, font_size, link, m_wiki_socket->ws_get_bind_port(), pos, height, split_total - 1, m_wiki_config->wc_get_body_image_flag() ? " background=\"B.body.png\"" : ""); memcpy(m_curr_page + len, m_curr_content + m_split_pos[0].start, m_split_pos[0].len); len += m_split_pos[0].len; len += sprintf(m_curr_page + len, WIKI_HTTP_END_HTML); *buf = m_curr_page; return len; } return 0; }
int WikiManage::wiki_full_search_one_page(char **buf, int *size, int page) { full_search_t *fs = &m_search_buf; int last_page = fs->page_total / PAGE_TOTAL; if (fs->page_total % PAGE_TOTAL) last_page++; if (page < 1) page = 1; if (page > last_page) page = last_page; fs->curr_page = page; int len, pos = 0; struct one_lang *p; sort_idx_t idx; pos = sprintf(m_curr_page + pos, "<table border=0>\n"); for (int i = PAGE_TOTAL * (page - 1); i < PAGE_TOTAL * page && i < fs->page_total; i++) { if ((p = wiki_full_search_find_lang(i)) == NULL) continue; if (p->index->wi_find(NULL, WK_INDEX_FIND, fs->page_idx[i], &idx, &len) == -1) continue; char title[128]; p->index->wi_get_key(&idx, title); pos += sprintf(m_curr_page + pos, "<tr><td width=100%%>" "<a href='idx:%d'><font size=4>%s</font></a><br/>\n", i, title); int show_flag = m_wiki_config->wc_get_full_text_show(); if (show_flag == FULL_TEXT_SHOW_SOME || show_flag == FULL_TEXT_SHOW_ALL) { if ((len = p->data->wd_sys_read(idx.data_file_idx, idx.data_pos, idx.data_len, m_curr_content, _MAX_ONE_PAGE_SIZE)) > 0) { m_curr_content[len] = 0; if (show_flag == FULL_TEXT_SHOW_SOME) len = convert_page_complex(m_buf, m_curr_content, len, fs->key); else { if (m_wiki_config->wc_get_audio_flag()) { len = wiki_parse_audio_flag(m_curr_content, len, m_buf); memcpy(m_curr_content, m_buf, len); m_curr_content[len] = 0; } if (m_wiki_config->wc_get_need_translate()) { len = wiki_translate_format(m_curr_content, len, m_buf); memcpy(m_curr_content, m_buf, len); m_curr_content[len] = 0; } len = convert_page_simple(m_buf, m_curr_content, len, fs->key); } memcpy(m_curr_page + pos, m_buf, len); pos += len; } } pos += sprintf(m_curr_page + pos, "%s", "<hr>\n</td</tr>\n"); } pos += sprintf(m_curr_page + pos, "</table>\n"); char next[1024] = " ", before[1024] = " "; if (page < last_page) sprintf(next, "<a href=\"page:%d\"><font size=4><b>>>>>></b></font></a>", page + 1); if (page > 1) sprintf(before, "<a href=\"page:%d\"><font size=4><b><<<<<</b></font></a>", page - 1); pos += sprintf(m_curr_page + pos, "<table border=0 width=100%%><tr>" "<td align=left width=40%%>%s</td>" "<td align=center width=20%%>%d/%d</td>" "<td align=right width=40%%>%s</td></tr></table>\n", before, page, last_page, next); m_curr_page[pos] = 0; return wiki_not_found(buf, size, m_curr_page, pos); }