예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
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);
}
예제 #4
0
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.");
}
예제 #5
0
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.");
}
예제 #6
0
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;
}
예제 #7
0
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);
}
예제 #8
0
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;
}
예제 #9
0
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;
}
예제 #10
0
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);
}
예제 #11
0
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);
}
예제 #12
0
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;
}
예제 #13
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] = "&nbsp;", before[1024] = "&nbsp;";

	if (page < last_page)
		sprintf(next, "<a href=\"page:%d\"><font size=4><b>&gt;&gt;&gt;&gt;&gt;</b></font></a>", page + 1);

	if (page > 1)
		sprintf(before, "<a href=\"page:%d\"><font size=4><b>&lt;&lt;&lt;&lt;&lt;</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);
}