summaryrefslogtreecommitdiffstats
path: root/core/ustring.cpp
diff options
context:
space:
mode:
authorZher Huei Lee <lee.zh.92@gmail.com>2017-10-11 16:27:54 +0800
committerZher Huei Lee <lee.zh.92@gmail.com>2017-11-01 07:20:20 +0800
commit0804dd53364107001f31948a9ec9fe331bc92a4a (patch)
treeb40719054bdae31832e870a17d88ab7a20ff8ba9 /core/ustring.cpp
parent29ea79e065cb1ecffec6b8ad17d9996f21abf1cb (diff)
downloadredot-engine-0804dd53364107001f31948a9ec9fe331bc92a4a.tar.gz
Added String::dedent() to remove text indentation
This functions similarly to Python's textwrap.dedent() It's also been applied to doc_data.cpp to remove extra whitespace while parsing the XML.
Diffstat (limited to 'core/ustring.cpp')
-rw-r--r--core/ustring.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/core/ustring.cpp b/core/ustring.cpp
index 80881f1adb..415494ddc8 100644
--- a/core/ustring.cpp
+++ b/core/ustring.cpp
@@ -2757,6 +2757,48 @@ CharType String::ord_at(int p_idx) const {
return operator[](p_idx);
}
+String String::dedent() const {
+
+ String new_string;
+ String indent;
+ bool has_indent = false;
+ bool has_text = false;
+ int line_start = 0;
+ int indent_stop = -1;
+
+ for (int i = 0; i < length(); i++) {
+
+ CharType c = operator[](i);
+ if (c == '\n') {
+ if (has_text)
+ new_string += substr(indent_stop, i - indent_stop);
+ new_string += "\n";
+ has_text = false;
+ line_start = i + 1;
+ indent_stop = -1;
+ } else if (!has_text) {
+ if (c > 32) {
+ has_text = true;
+ if (!has_indent) {
+ has_indent = true;
+ indent = substr(line_start, i - line_start);
+ indent_stop = i;
+ }
+ }
+ if (has_indent && indent_stop < 0) {
+ int j = i - line_start;
+ if (j >= indent.length() || c != indent[j])
+ indent_stop = i;
+ }
+ }
+ }
+
+ if (has_text)
+ new_string += substr(indent_stop, length() - indent_stop);
+
+ return new_string;
+}
+
String String::strip_edges(bool left, bool right) const {
int len = length();