X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.h;h=36ba09fcb973b95fb5f8a4856b6dc75e9dbb957f;hb=7a124ab8614efa113cc08205c47aeb720b2e2b9e;hp=0d21e954a4308600bce39a3e81dc469256fc32c9;hpb=7d31194085d8665fd10cc2e8fe4a6330b3cd338f;p=lyx.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 0d21e954a4..36ba09fcb9 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -151,8 +151,11 @@ inline bool contains(docstring const & a, char_type b) return a.find(b) != docstring::npos; } -/// +/// Returns true if the first argument is made of ascii chars given in the +/// second argument. bool containsOnly(std::string const &, std::string const &); +/// +bool containsOnly(docstring const &, std::string const &); /** Extracts a token from this string at the nth delim. Doesn't modify the original string. Similar to strtok. @@ -266,6 +269,33 @@ docstring const rsplit(docstring const & a, char_type delim); /// problems in latex labels. docstring const escape(docstring const & lab); +/// Group contents of an argument if needed +docstring const protectArgument(docstring & arg, char const l = '[', + char const r = ']'); + +/// 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 @@ -274,6 +304,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); @@ -281,6 +315,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); @@ -302,30 +340,29 @@ 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); -template -docstring bformat(docstring const & fmt, Arg1); -template -docstring bformat(docstring const & fmt, Arg1, Arg2); +/// 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, Arg2, Arg3); -template -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); -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); -template<> docstring bformat(docstring const & fmt, docstring arg1, docstring arg2); -template<> docstring bformat(docstring const & fmt, docstring arg1, int arg2); -template<> docstring bformat(docstring const & fmt, char const * arg1, docstring arg2); -template<> docstring bformat(docstring const & fmt, int arg1, int arg2); -template<> docstring bformat(docstring const & fmt, docstring arg1, docstring arg2, docstring arg3); -template<> docstring bformat(docstring const & fmt, docstring arg1, docstring arg2, docstring arg3, docstring arg4); +docstring bformat(docstring const & fmt, int arg1); +docstring bformat(docstring const & fmt, long arg1); +#ifdef LYX_USE_LONG_LONG +docstring bformat(docstring const & fmt, long long arg1); +#endif +docstring bformat(docstring const & fmt, unsigned int arg1); +docstring bformat(docstring const & fmt, docstring const & arg1); +docstring bformat(docstring const & fmt, char * arg1); +docstring bformat(docstring const & fmt, docstring const & arg1, docstring const & arg2); +docstring bformat(docstring const & fmt, docstring const & arg1, int arg2); +docstring bformat(docstring const & fmt, char const * arg1, docstring const & arg2); +docstring bformat(docstring const & fmt, int arg1, int arg2); +docstring bformat(docstring const & fmt, docstring const & arg1, docstring const & arg2, docstring const & arg3); +docstring bformat(docstring const & fmt, docstring const & arg1, docstring const & arg2, docstring const & arg3, docstring const & arg4); } // namespace support