X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.h;h=ac310c59c43dcc598e6a6016c447e91a0bc274d2;hb=8d640dc77608bedddb5b00982c23665584f52d21;hp=2606546fa05ce3c29cdb5c0c47341e83e1fd814c;hpb=f4eae12d60af89eb9f4d6840578075a69215ab28;p=lyx.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 2606546fa0..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. @@ -194,6 +199,14 @@ 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". @@ -253,6 +266,29 @@ docstring const rsplit(docstring const & a, char_type delim); /// 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 @@ -261,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); @@ -268,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); @@ -289,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); @@ -304,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);