static void add_prefixes(const ucs4::string& str, size_t length, markov_prefix_map& res) { for(size_t i = 0; i <= str.size(); ++i) { const size_t start = i > length ? i - length : 0; const ucs4::string key(str.begin() + start, str.begin() + i); const ucs4::char_t c = i != str.size() ? str[i] : 0; res[key].push_back(c); } }
bool ttext::set_text(const std::string& text, const bool markedup) { if(markedup != markedup_text_ || text != text_) { assert(layout_); const ucs4::string wide = unicode_cast<ucs4::string>(text); const std::string narrow = unicode_cast<utf8::string>(wide); if(text != narrow) { ERR_GUI_L << "ttext::" << __func__ << " text '" << text << "' contains invalid utf-8, trimmed the invalid parts.\n"; } if(markedup) { if(!set_markup(narrow)) { return false; } } else { /* * pango_layout_set_text after pango_layout_set_markup might * leave the layout in an undefined state regarding markup so * clear it unconditionally. */ pango_layout_set_attributes(layout_, nullptr); pango_layout_set_text(layout_, narrow.c_str(), narrow.size()); } text_ = narrow; length_ = wide.size(); markedup_text_ = markedup; calculation_dirty_ = true; surface_dirty_ = true; } return true; }