void ArticleView::AppendHeader(const char *dict_name, const char *dict_link) { if (bookname_style == BookNameStyle_Default) { } else if (bookname_style == BookNameStyle_OneBlankLine) { if(++headerindex > 0) append_pango_text("\n"); } else { if(++headerindex > 0) append_pango_text("\n\n"); } AppendHeaderMark(); if (dict_link) { std::string mark; if ((bookname_style == BookNameStyle_Default) || (bookname_style == BookNameStyle_OneBlankLine)) { mark= "<span foreground=\"blue\"><--- <u>"; } else { mark= "<span foreground=\"blue\"><u>"; } LinksPosList links_list; std::string link(dict_link); links_list.push_back(LinkDesc(5, g_utf8_strlen(dict_name, -1), link)); gchar *m_str = g_markup_escape_text(dict_name, -1); mark += m_str; g_free(m_str); if ((bookname_style == BookNameStyle_Default) || (bookname_style == BookNameStyle_OneBlankLine)) { mark += "</u> ---></span>\n"; } else { mark += "</u></span>\n"; } append_pango_text_with_links(mark, links_list); } else { std::string mark= "<span foreground=\"blue\">"; #ifdef CONFIG_GPE if ((bookname_style == BookNameStyle_Default) || (bookname_style == BookNameStyle_OneBlankLine)) { mark+= "<- "; } else { } #else if ((bookname_style == BookNameStyle_Default) || (bookname_style == BookNameStyle_OneBlankLine)) { mark+= "<--- "; } else { } #endif gchar *m_str = g_markup_escape_text(dict_name, -1); mark += m_str; g_free(m_str); #ifdef CONFIG_GPE if ((bookname_style == BookNameStyle_Default) || (bookname_style == BookNameStyle_OneBlankLine)) { mark += " -></span>\n"; } else { mark += "</span>\n"; } #else if ((bookname_style == BookNameStyle_Default) || (bookname_style == BookNameStyle_OneBlankLine)) { mark += " ---></span>\n"; } else { mark += "</span>\n"; } #endif append_pango_text(mark.c_str()); } }
static void html2result(const char *p, ParseResult &result) { LinksPosList links_list; std::string res; const char *tag, *next; std::string name; std::string::size_type cur_pos; int i; struct ReplaceTag { const char *match_; int match_len_; const char *replace_; int char_len_; }; static const ReplaceTag replace_arr[] = { { "b>", 2, "<b>", 0 }, { "/b>", 3, "</b>", 0 }, { "big>", 4, "<big>", 0}, { "/big>", 5, "</big>", 0}, { "i>", 2, "<i>", 0 }, { "/i>", 3, "</i>", 0 }, { "s>", 2, "<s>", 0 }, { "/s>", 3, "</s>", 0 }, { "sub>", 4, "<sub>", 0 }, { "/sub>", 5, "</sub>", 0}, { "sup>", 4, "<sup>", 0}, { "/sup>", 5, "</sup>", 0}, { "small>", 6, "<small>", 0}, { "/small>", 7, "</small>", 0}, { "tt>", 3, "<tt>", 0}, { "/tt>", 4, "</tt>", 0}, { "u>", 2, "<u>", 0 }, { "/u>", 3, "</u>", 0 }, { "br>", 3, "\n", 1 }, { "nl>", 3, "", 0 }, { "hr>", 3, "\n<span foreground=\"gray\"><s> </s></span>\n", 7 }, { "/font>", 6, "</span>", 0 }, { NULL, 0, NULL }, }; for (cur_pos = 0; *p && (tag = strchr(p, '<')) != NULL;) { std::string chunk(p, tag - p); size_t pango_len; std::string pango; html_topango(chunk, pango, pango_len); res += pango; cur_pos += pango_len; p = tag; for (i = 0; replace_arr[i].match_; ++i) if (strncasecmp(replace_arr[i].match_, p + 1, replace_arr[i].match_len_) == 0) { res += replace_arr[i].replace_; p += 1 + replace_arr[i].match_len_; cur_pos += replace_arr[i].char_len_; goto cycle_end; } if (strncasecmp(p+1, "font ", 5)==0) { next = strchr(p, '>'); if (!next) { ++p; continue; } res += "<span"; name.assign(p + 6, next - (p + 6)); const char *p1 = strcasestr(name.c_str(), "face="); if (p1) { p1 += sizeof("face=") -1 +1; const char *p2 = p1; while (true) { if (*p2 == '\0') { p2 = NULL; break; } if (*p2 == '\'' || *p2 == '"') break; p2++; } if (p2) { std::string face(p1, p2-p1); res += " face=\""; res += face; res += "\""; } } p1 = strcasestr(name.c_str(), "color="); if (p1) { p1 += sizeof("color=") -1; if (*p1 == '\'' || *p1 == '\"') p1++; const char *p2 = p1; while (true) { if (*p2 == '\0') { p2 = NULL; break; } if (*p2 == '\'' || *p2 == '"' || *p2 == ' ' || *p2 == '>') break; p2++; } if (p2) { std::string color(p1, p2-p1); if (pango_color_parse(NULL, color.c_str())) { res += " foreground=\""; res += color; res += "\""; } } } res += ">"; p = next + 1; } else if ((*(p + 1) == 'a' || *(p + 1) == 'A') && *(p + 2) == ' ') { next = strchr(p, '>'); if (!next) { p++; continue; } p+=3; name.assign(p, next - p); const char *p1 = strcasestr(name.c_str(), "href="); std::string link; if (p1) { p1 += sizeof("href=") -1 +1; const char *p2 = p1; while (true) { if (*p2 == '\0') { p2 = NULL; break; } if (*p2 == '\'' || *p2 == '"') break; p2++; } if (p2) { link.assign(p1, p2-p1); } } p = next + 1; next = strcasestr(p, "</a>"); if (!next) { continue; } res += "<span foreground=\"lightblue\" underline=\"single\">"; std::string::size_type link_len = next - p; std::string chunk(p, link_len); html_topango(chunk, pango, pango_len); links_list.push_back(LinkDesc(cur_pos, pango_len, link)); res += pango; cur_pos += pango_len; res += "</span>"; p = next + sizeof("</a>") - 1; } else if (strncasecmp(p+1, "ref>", 4)==0) { next = strcasestr(p, "</ref>"); if (!next) { p++; continue; } p+=5; res += "<span foreground=\"lightblue\" underline=\"single\">"; std::string::size_type link_len = next - p; std::string chunk(p, link_len); html_topango(chunk, pango, pango_len); std::string xml_enc; xml_decode(chunk.c_str(), xml_enc); std::string link; link = "query://"; link += xml_enc; links_list.push_back(LinkDesc(cur_pos, pango_len, link)); res += pango; cur_pos += pango_len; res += "</span>"; p = next + sizeof("</ref>") - 1; } else if (strncasecmp(p+1, "img ", 4)==0) { next = strchr(p+5, '>'); if (!next) { p++; continue; } name.assign(p+5, next - (p+5)); p = next + 1; const char *p1 = strcasestr(name.c_str(), "src="); std::string src; if (p1) { p1 += sizeof("src=") -1 +1; const char *p2 = p1; while (true) { if (*p2 == '\0') { p2 = NULL; break; } if (*p2 == '\'' || *p2 == '"') break; p2++; } if (p2) { src.assign(p1, p2-p1); } } if (!src.empty()) { ParseResultItem item; item.type = ParseResultItemType_link; item.link = new ParseResultLinkItem; item.link->pango = res; item.link->links_list = links_list; result.item_list.push_back(item); res.clear(); cur_pos = 0; links_list.clear(); item.type = ParseResultItemType_res; item.res = new ParseResultResItem; item.res->type = "image"; int n = src.length(); if (src[0]==0x1e && src[n-1]==0x1f) { item.res->key.assign(src.c_str()+1, n-2); } else { item.res->key = src; } result.item_list.push_back(item); } } else { next = strchr(p+1, '>'); if (!next) { p++; res += "<"; cur_pos++; continue; } p = next + 1; } cycle_end: ; } res += p; ParseResultItem item; item.type = ParseResultItemType_link; item.link = new ParseResultLinkItem; item.link->pango = res; item.link->links_list = links_list; result.item_list.push_back(item); }
static void powerword_markup_add_text(const gchar *text, gssize length, std::string *pango, std::string::size_type &cur_pos, LinksPosList *links_list) { const gchar *p; const gchar *end; p = text; end = text + length; GString *str; str = g_string_sized_new (length); const gchar *n; bool find; bool previous_islink = false; std::string marktags; guint currentmarktag = 0; while (p != end) { const gchar *next; next = g_utf8_next_char (p); switch (*p) { case '}': if (currentmarktag==0) { g_string_append (str, "}"); previous_islink = false; } else { currentmarktag--; switch (marktags[currentmarktag]) { case 'b': case 'B': g_string_append (str, "</b>"); previous_islink = false; break; case 'I': g_string_append (str, "</i>"); previous_islink = false; break; case '+': g_string_append (str, "</sup>"); previous_islink = false; break; case '-': g_string_append (str, "</sub>"); previous_islink = false; break; case 'x': g_string_append (str, "</span>"); previous_islink = false; break; case 'l': case 'D': case 'L': case 'U': g_string_append (str, "</span>"); previous_islink = true; break; default: previous_islink = false; break; } } break; case '&': find = false; if (next!=end) { n = g_utf8_next_char(next); if (n!=end && *n == '{') { find=true; currentmarktag++; if (marktags.length()<currentmarktag) marktags+=*next; else marktags[currentmarktag-1]=*next; switch (*next) { case 'b': case 'B': g_string_append (str, "<b>"); next = n+1; break; case 'I': g_string_append (str, "<i>"); next = n+1; break; case '+': g_string_append (str, "<sup>"); next = n+1; break; case '-': g_string_append (str, "<sub>"); next = n+1; break; case 'x': g_string_append (str, "<span foreground=\"blue\" underline=\"single\">"); next = n+1; break; case 'X': case '2': { const gchar *tag_end = n+1; while (tag_end!=end) { if (*tag_end=='}') break; else tag_end++; } g_string_append (str, "<span foreground=\"blue\">"); gchar *tag_str; if (*next == 'X') { tag_str = toUtfPhonetic(n+1, tag_end - (n+1)); } else { tag_str = toUtfPhonetic2(n+1, tag_end - (n+1)); } g_string_append (str, tag_str); g_free(tag_str); g_string_append (str, "</span>"); currentmarktag--; if (tag_end!=end) next = tag_end+1; else next = end; previous_islink = false; break; } case 'l': case 'D': case 'L': case 'U': if (previous_islink) g_string_append (str, "\t"); if (*next == 'l' || *next == 'D') g_string_append (str, "<span foreground=\"blue\" underline=\"single\">"); else g_string_append (str, "<span foreground=\"#008080\" underline=\"single\">"); *pango += str->str; cur_pos += xml_strlen(str->str); g_string_erase(str, 0, -1); { const gchar *tag_end = n+1; while (tag_end!=end) { if (*tag_end=='}') break; else tag_end++; } char *tmpstr = g_markup_escape_text(n+1, tag_end - (n+1)); size_t xml_len = xml_strlen(tmpstr); std::string link("query://"); link.append(n+1, tag_end - (n+1)); links_list->push_back(LinkDesc(cur_pos, xml_len, link)); *pango += tmpstr; cur_pos += xml_len; g_free(tmpstr); g_string_append (str, "</span>"); currentmarktag--; if (tag_end!=end) next = tag_end+1; else next = end; previous_islink = true; break; } /*case ' ': case '9': case 'S':*/ default: next = n+1; break; } } } if (!find) { previous_islink = false; g_string_append (str, "&"); } break; case '<': previous_islink = false; g_string_append (str, "<"); break; case '>': previous_islink = false; g_string_append (str, ">"); break; case '\'': previous_islink = false; g_string_append (str, "'"); break; case '"': previous_islink = false; g_string_append (str, """); break; default: previous_islink = false; g_string_append_len (str, p, next - p); break; } p = next; } if (currentmarktag>0) { do { currentmarktag--; switch (marktags[currentmarktag]) { case 'b': case 'B': g_string_append (str, "</b>"); break; case 'I': g_string_append (str, "</i>"); break; case '+': g_string_append (str, "</sup>"); break; case '-': g_string_append (str, "</sub>"); break; case 'x': case 'l': case 'D': case 'L': case 'U': g_string_append (str, "</span>"); break; default: break; } } while (currentmarktag>0); } *pango += str->str; cur_pos += xml_strlen(str->str); g_string_free (str, TRUE); }
static void wordnet2result(const char *p, size_t sec_size, ParseResult &result, const char *oword) { WnUserData Data; Data.oword = oword; GMarkupParser parser; parser.start_element = NULL; parser.end_element = NULL; parser.text = func_parse_text; parser.passthrough = NULL; parser.error = NULL; GMarkupParseContext* context = g_markup_parse_context_new(&parser, (GMarkupParseFlags)0, &Data, NULL); g_markup_parse_context_parse(context, p, sec_size, NULL); g_markup_parse_context_end_parse(context, NULL); g_markup_parse_context_free(context); LinksPosList links_list; std::string res; std::string::size_type cur_pos = 0; char *eword; if (Data.type == "n") { res += "Noun\n"; cur_pos += sizeof("Noun\n")-1; } else if (Data.type == "v") { res += "Verb\n"; cur_pos += sizeof("Verb\n")-1; } else if (Data.type == "a") { res += "Adjective\n"; cur_pos += sizeof("Adjective\n")-1; } else if (Data.type == "s") { res += "Adjective satellite\n"; cur_pos += sizeof("Adjective satellite\n")-1; } else if (Data.type == "r") { res += "Adverb\n"; cur_pos += sizeof("Adverb\n")-1; } else { eword = g_markup_escape_text(Data.type.c_str(), Data.type.length()); res += eword; g_free(eword); cur_pos += g_utf8_strlen(Data.type.c_str(), Data.type.length()); } size_t utf8_len; for (std::list<std::string>::iterator i = Data.wordlist.begin(); i != Data.wordlist.end(); ++i) { if (i != Data.wordlist.begin()) { res += '\t'; cur_pos++; } res += "<span foreground=\"blue\" underline=\"single\">"; utf8_len = g_utf8_strlen(i->c_str(), i->length()); std::string link; link = "query://"; link += *i; links_list.push_back(LinkDesc(cur_pos, utf8_len, link)); eword = g_markup_escape_text(i->c_str(), i->length()); res += eword; g_free(eword); res += "</span>"; cur_pos += utf8_len; } if (!Data.wordlist.empty()) { res += '\n'; //cur_pos++; } eword = g_markup_escape_text(Data.gloss.c_str(), Data.gloss.length()); res += eword; g_free(eword); //cur_pos += g_utf8_strlen(Data.gloss.c_str(), Data.gloss.length()); ParseResultItem item; item.type = ParseResultItemType_link; item.link = new ParseResultLinkItem; item.link->pango = res; item.link->links_list = links_list; result.item_list.push_back(item); }