X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.h;h=ac310c59c43dcc598e6a6016c447e91a0bc274d2;hb=57b69a5efddf9f3c148007322f00dad6c253a2ed;hp=66ea9df7057821894b6b816839503353f037b9b0;hpb=aafd52f44167d5510be1ddcb974daa9dae486933;p=lyx.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 66ea9df705..ac310c59c4 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -28,6 +28,9 @@ namespace support { /// Does not depend on the locale. int compare_no_case(docstring const & s, docstring const & s2); +/// Compare \p s and \p s2 using the collating rules of the current locale. +int compare_locale(docstring const & s, docstring const & s2); + /// Compare \p s and \p s2, ignoring the case of ASCII characters only. int compare_ascii_no_case(std::string const & s, std::string const & s2); @@ -97,6 +100,8 @@ docstring const ascii_lowercase(docstring const &); /// Changes the case of \p s to lowercase. /// Does not depend on the locale. docstring const lowercase(docstring const & s); +// Currently unused, but the code is there if needed. +// std::string const lowercase(std::string const & s); /// Changes the case of \p s to uppercase. /// Does not depend on the locale. @@ -188,9 +193,20 @@ std::string const subst(std::string const & a, docstring const subst(docstring const & a, docstring const & oldstr, docstring const & newstr); +/// Count all occurences of char \a chr inside \a str +int count_char(std::string const & str, char chr); + /// Count all occurences of char \a chr inside \a str int count_char(docstring const & str, docstring::value_type chr); +/** Count all occurences of binary chars inside \a str. + It is assumed that \a str is utf-8 encoded and that a binary char + belongs to the unicode class names Zl, Zp, Cc, Cf, Cs, Co, or Cn + (excluding white space characters such as '\t', '\n', '\v', '\f', '\r'). + See http://www.unicode.org/Public/6.2.0/ucd/UnicodeData.txt +*/ +int count_bin_chars(std::string const & str); + /** Trims characters off the end and beginning of a string. \code trim("ccabccc", "c") == "ab". @@ -243,12 +259,36 @@ std::string const split(std::string const & a, char delim); /// Same as split but uses the last delim. std::string const rsplit(std::string const & a, std::string & piece, char delim); +docstring const rsplit(docstring const & a, docstring & piece, char_type delim); docstring const rsplit(docstring const & a, char_type delim); /// Escapes non ASCII chars and other problematic characters that cause /// problems in latex labels. docstring const escape(docstring const & lab); +/// Truncates a string with an ellipsis at the end. Leaves str unchanged and +/// returns false if it is shorter than len. Otherwise resizes str to len, with +/// U+2026 HORIZONTAL ELLIPSIS at the end, and returns true. +/// +/// Warning (Unicode): The cases where we want to truncate the text and it does +/// not end up converted into a QString for UI display must be really +/// rare. Whenever possible, we should prefer calling QFontMetrics::elidedText() +/// instead, which takes into account the actual length on the screen and the +/// layout direction (RTL or LTR). Or a similar function taking into account the +/// font metrics from the buffer view, which still has to be defined. Or set up +/// the widgets such that Qt elides the string automatically with the exact +/// needed width. Recall that not only graphemes vary greatly in width, but also +/// can be made of several code points. See: +/// +/// +/// What is acceptable is when we know that the string is probably going to be +/// elided by Qt anyway, and len is chosen such that our own ellipsis will only +/// be displayed in worst-case scenarios. +/// +/// FIXME: apply those principles in the current code. +/// +bool truncateWithEllipsis(docstring & str, size_t const len); + /// Word-wraps the provided docstring, returning a line-broken string /// of width no wider than width, with the string broken at spaces. /// If the string cannot be broken appropriately, it returns something @@ -257,6 +297,10 @@ docstring const escape(docstring const & lab); /// If indent is positive, then the first line is indented that many /// spaces. If it is negative, then successive lines are indented, as /// if the first line were "outdented". +/// +/// Warning (Unicode): uses truncateWithEllipsis() internally. Therefore it is +/// subject to the same warning and FIXME as above. +/// docstring wrap(docstring const & str, int const indent = 0, size_t const width = 80); @@ -264,6 +308,10 @@ docstring wrap(docstring const & str, int const indent = 0, /// that may contain embedded newlines. /// \param numlines Don't return more than numlines lines. If numlines /// is 0, we return everything. +/// +/// Warning (Unicode): uses truncateWithEllipsis() internally. Therefore it is +/// subject to the same warning and FIXME as above. +/// docstring wrapParas(docstring const & str, int const indent = 0, size_t const width = 80, size_t const maxlines = 10); @@ -285,6 +333,15 @@ docstring const getStringFromVector(std::vector const & vec, /// found, else -1. The last item in \p str must be "". int findToken(char const * const str[], std::string const & search_token); + +/// Format a floating point number with at least 6 siginificant digits, but +/// without scientific notation. +/// Scientific notation would be invalid in some contexts, such as lengths for +/// LaTeX. Simply using std::ostream with std::fixed would produce results +/// like "1000000.000000", and precision control would not be that easy either. +std::string formatFPNumber(double); + + template docstring bformat(docstring const & fmt, Arg1); @@ -300,6 +357,9 @@ docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3, Arg4); template<> docstring bformat(docstring const & fmt, int arg1); template<> docstring bformat(docstring const & fmt, long arg1); +#ifdef LYX_USE_LONG_LONG +template<> docstring bformat(docstring const & fmt, long long arg1); +#endif template<> docstring bformat(docstring const & fmt, unsigned int arg1); template<> docstring bformat(docstring const & fmt, docstring arg1); template<> docstring bformat(docstring const & fmt, char * arg1);