int WikiManage::wiki_random_select_lang(char **buf, int *size) { sort_idx_t idx; int n = rand() % m_select_lang_total; struct one_lang *which; if (m_select_lang_total <= 0) /* TODO */ return wiki_not_found(buf, size, "I'm Blank"); if ((which = wiki_get_lang_addr(m_select_lang[n])) == NULL) { wiki_init_one_lang(m_select_lang[n], 0); if ((which = wiki_get_lang_addr(m_select_lang[n])) == NULL) { return wiki_not_found(buf, size, "Not found"); } } m_curr_lang = which; for (int i = 0; i < 100; i++) { which->index->wi_random_key(&idx); if ((n = wiki_read_data(&idx, buf, NULL)) > 0) { wiki_push_back(STATUS_CONTENT, wiki_curr_title(), n, &idx); *size = n; return n; } } return -1; }
int WikiManage::wiki_view_index(int idx, char **buf, int *size) { int n; char tmp[256]; wiki_title_t *p; WikiIndex *wiki_index; if (idx >= m_match_title_total) { *buf = m_buf; *size = wiki_not_found(buf, size, NOT_FOUND); return 0; } p = &m_match_title[idx]; wiki_index = p->which->index; m_curr_lang = p->which; wiki_index->wi_get_key(&p->idx, tmp); if ((n = wiki_read_data(&p->idx, buf, tmp)) > 0) { wiki_push_back(STATUS_MATCH_KEY, m_curr_match_key, 0, NULL); wiki_push_back(STATUS_CONTENT, wiki_curr_title(), n, &p->idx); *size = n; return n; } *buf = m_buf; *size = wiki_not_found(buf, size, "Data file error."); return 0; }
int WikiManage::wiki_index_msg(char **buf, int *size) { int n; int flag = m_wiki_config->wc_get_home_page_flag(); switch (flag) { case HOME_PAGE_BLANK: char tmp[1024]; sprintf(tmp, _("WELCOME"), _VERSION, __DATE__); return wiki_not_found(buf, size, tmp); break; case HOME_PAGE_LAST_READ: if ((n = wiki_page_last_read(buf, size)) != -1) return n; break; case HOME_PAGE_CURR_DATE: if ((n = wiki_curr_date_home_page(buf, size)) != -1) return n; break; default: break; } return wiki_not_found(buf, size, NOT_FOUND); }
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_random_page(char **buf, int *size) { int n = -1, flag = m_wiki_config->wc_get_random_flag(); switch (flag) { case RANDOM_HISTORY: n = wiki_random_history(buf, size); break; case RANDOM_FAVORITE: n = wiki_random_favorite(buf, size); break; case RANDOM_SELECT_LANG: n = wiki_random_select_lang(buf, size); break; case RANDOM_ALL_LANG: n = wiki_random_all_lang(buf, size); break; default: break; }; if (n >= 0) return n; return wiki_not_found(buf, size, "I'm Blank."); }
char *WikiManage::wiki_about() { int size; char *buf, tmp[4096]; sprintf(tmp, _("FW_ABOUT_MSG"), _VERSION, __DATE__); wiki_not_found(&buf, &size, tmp); buf[size] = 0; return buf; }
int WikiManage::wiki_random_favorite(char **buf, int *size) { struct one_lang *which; struct fav_key key; struct fav_value value; if (!m_wiki_favorite->wf_random(&key, &value)) return wiki_not_found(buf, size, _("FW_RANDOM_RETRY")); if ((which = wiki_get_lang_addr(key.lang)) == NULL) { wiki_init_one_lang(key.lang, 0); if ((which = wiki_get_lang_addr(key.lang)) == NULL) { return wiki_not_found(buf, size, "Not found"); } } m_curr_lang = which; return wiki_find_key(key.title, buf, size); }
int WikiManage::wiki_href(int href_idx, char **buf, int *size, const char *title) { int n, total; sort_idx_t idx[MAX_FIND_RECORD + 1]; WikiIndex *wiki_index = CURR_WIKI(index); if (wiki_index->wi_find(NULL, WK_INDEX_FIND, href_idx, idx, &total) == -1) { wiki_not_found(buf, size, _("WIKI_HREF_NOTFOUND")); /* TODO */ return -1; } if ((n = wiki_read_data(&idx[0], buf, title)) > 0) { wiki_push_back(STATUS_CONTENT, wiki_curr_title(), n, &idx[0]); *size = n; return 0; } wiki_not_found(buf, size, NOT_FOUND); return -1; }
int WikiManage::wiki_view_history(int idx, char **buf, int *size) { int n = 0; char tmp[1024]; struct tmp_history *p = &m_history[idx]; if (idx < 0 || idx >= m_history_total) return 0; if (wiki_init_one_lang(p->data->lang, 1) == -1) { sprintf(tmp, "Not found dictionary: %s", p->data->lang); return wiki_not_found(buf, size, tmp); } if ((n = wiki_find_key(p->data->title, buf, size)) == -1) { sprintf(tmp, "Not found %s in dictionary %s", p->data->title, p->data->lang); return wiki_not_found(buf, size, tmp); } return *size; }
int WikiManage::wiki_full_search(const char *key, char **buf, int *size, int page) { struct one_lang *which; SET_CURR_TITLE(key); if (wiki_check_full_search(key) == 0) wiki_full_search_update(key); if (m_search_buf.page_total == 0) return wiki_not_found(buf, size, "Not found"); if (page == 0) { m_curr_lang = &m_all_lang[0]; wiki_push_back(STATUS_FULL_TEXT, key, 0, NULL); } return wiki_full_search_one_page(buf, size, page); }
int WikiManage::wiki_curr_date_home_page(char **buf, int *size) { int pos = 0, total = 0; char *lang, date[128], tmp[4096], save_date[128]; struct one_lang *which; pos += sprintf(tmp, "<table cellspacing=0.5 width=100%% border=1>\n" "<tr><td width=30%%>%s</td><td width=70%%>%s</td></tr>\n", _("FW_HP_DICT"), _("FW_HP_CURR_DATE")); for (int i = 0; i < m_select_lang_total; i++) { lang = m_select_lang[i]; get_month_day_from_lang(date, lang); if (date[0] == 0) continue; if ((which = wiki_get_lang_addr(lang)) == NULL) { wiki_init_one_lang(lang, 0); if ((which = wiki_get_lang_addr(lang)) == NULL) { continue; } } total++; strcpy(save_date, date); m_curr_lang = which; pos += snprintf(tmp + pos, sizeof(tmp) - pos, "<tr><td width=30%%>%s</td><td width=70%%><a href='lang:%s:%s'>%s</a></td></tr>\n", lang, lang, date, date); } if (total == 0) strcpy(tmp, _("CANNT_FIND_CURR_DATE")); else if (total == 1) return wiki_find_key(save_date, buf, size); else pos += snprintf(tmp + pos, sizeof(tmp) - pos, "%s", "</table>\n"); return wiki_not_found(buf, size, tmp); }
int WikiManage::wiki_random_all_lang(char **buf, int *size) { int total = 0; struct lang_list lang[128]; struct one_lang *which; sort_idx_t idx; memset(lang, 0, sizeof(lang)); wiki_get_lang_list(lang, &total); if (total <= 0) return -1; int n = rand() % total; if ((which = wiki_get_lang_addr(lang[n].lang)) == NULL) { wiki_init_one_lang(lang[n].lang, 0); if ((which = wiki_get_lang_addr(lang[n].lang)) == NULL) { return wiki_not_found(buf, size, "Not found"); } } m_curr_lang = which; for (int i = 0; i < 100; i++) { which->index->wi_random_key(&idx); if ((n = wiki_read_data(&idx, buf, NULL)) > 0) { wiki_push_back(STATUS_CONTENT, wiki_curr_title(), n, &idx); *size = n; return n; } } return -1; }
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); }