mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Rewrite FormatParagraph to handle newlines within input strings correctly
This commit is contained in:
parent
cddffaf5e6
commit
cc2095ecae
@ -404,7 +404,22 @@ BOOST_AUTO_TEST_CASE(test_FormatParagraph)
|
|||||||
BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 0), "test\ntest");
|
BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 0), "test\ntest");
|
||||||
BOOST_CHECK_EQUAL(FormatParagraph("testerde test", 4, 0), "testerde\ntest");
|
BOOST_CHECK_EQUAL(FormatParagraph("testerde test", 4, 0), "testerde\ntest");
|
||||||
BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 4), "test\n test");
|
BOOST_CHECK_EQUAL(FormatParagraph("test test", 4, 4), "test\n test");
|
||||||
BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string. This is a second sentence in the very long test string."), "This is a very long test string. This is a second sentence in the very long\ntest string.");
|
|
||||||
|
// Make sure we don't indent a fully-new line following a too-long line ending
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("test test\nabc", 4, 4), "test\n test\nabc");
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length until it gets here", 79), "This_is_a_very_long_test_string_without_any_spaces_so_it_should_just_get_returned_as_is_despite_the_length\nuntil it gets here");
|
||||||
|
|
||||||
|
// Test wrap length is exact
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79), "a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p", 79), "x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\nf g h i j k l m n o p");
|
||||||
|
// Indent should be included in length of lines
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg h i j k", 79, 4), "x\na b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 a b c de\n f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 a b c d e fg\n h i j k");
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string. This is a second sentence in the very long test string.", 79), "This is a very long test string. This is a second sentence in the very long\ntest string.");
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string.\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79), "This is a very long test string.\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third sentence in the very long test string.", 79), "This is a very long test string.\n\nThis is a second sentence in the very long test string. This is a third\nsentence in the very long test string.");
|
||||||
|
BOOST_CHECK_EQUAL(FormatParagraph("Testing that normal newlines do not get indented.\nLike here.", 79), "Testing that normal newlines do not get indented.\nLike here.");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(test_FormatSubVersion)
|
BOOST_AUTO_TEST_CASE(test_FormatSubVersion)
|
||||||
|
@ -478,34 +478,40 @@ bool ParseDouble(const std::string& str, double *out)
|
|||||||
std::string FormatParagraph(const std::string& in, size_t width, size_t indent)
|
std::string FormatParagraph(const std::string& in, size_t width, size_t indent)
|
||||||
{
|
{
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
size_t col = 0;
|
|
||||||
size_t ptr = 0;
|
size_t ptr = 0;
|
||||||
|
size_t indented = 0;
|
||||||
while (ptr < in.size())
|
while (ptr < in.size())
|
||||||
{
|
{
|
||||||
// Find beginning of next word
|
size_t lineend = in.find_first_of('\n', ptr);
|
||||||
ptr = in.find_first_not_of(' ', ptr);
|
if (lineend == std::string::npos) {
|
||||||
if (ptr == std::string::npos)
|
lineend = in.size();
|
||||||
break;
|
}
|
||||||
// Find end of next word
|
const size_t linelen = lineend - ptr;
|
||||||
size_t endword = in.find_first_of(' ', ptr);
|
const size_t rem_width = width - indented;
|
||||||
if (endword == std::string::npos)
|
if (linelen <= rem_width) {
|
||||||
endword = in.size();
|
out << in.substr(ptr, linelen + 1);
|
||||||
// Add newline and indentation if this wraps over the allowed width
|
ptr = lineend + 1;
|
||||||
if (col > 0)
|
indented = 0;
|
||||||
{
|
} else {
|
||||||
if ((col + endword - ptr) > width)
|
size_t finalspace = in.find_last_of(" \n", ptr + rem_width);
|
||||||
{
|
if (finalspace == std::string::npos || finalspace < ptr) {
|
||||||
out << '\n';
|
// No place to break; just include the entire word and move on
|
||||||
for(size_t i=0; i<indent; ++i)
|
finalspace = in.find_first_of("\n ", ptr);
|
||||||
out << ' ';
|
if (finalspace == std::string::npos) {
|
||||||
col = 0;
|
// End of the string, just add it and break
|
||||||
} else
|
out << in.substr(ptr);
|
||||||
out << ' ';
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << in.substr(ptr, finalspace - ptr) << "\n";
|
||||||
|
if (in[finalspace] == '\n') {
|
||||||
|
indented = 0;
|
||||||
|
} else if (indent) {
|
||||||
|
out << std::string(indent, ' ');
|
||||||
|
indented = indent;
|
||||||
|
}
|
||||||
|
ptr = finalspace + 1;
|
||||||
}
|
}
|
||||||
// Append word
|
|
||||||
out << in.substr(ptr, endword - ptr);
|
|
||||||
col += endword - ptr + 1;
|
|
||||||
ptr = endword;
|
|
||||||
}
|
}
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user