|
3 | 3 | import com.annimon.ownlang.lib.Arguments; |
4 | 4 | import com.annimon.ownlang.lib.ArrayValue; |
5 | 5 | import com.annimon.ownlang.lib.NumberValue; |
| 6 | +import com.annimon.ownlang.lib.StringValue; |
6 | 7 | import com.annimon.ownlang.lib.Value; |
7 | 8 | import java.io.UnsupportedEncodingException; |
8 | 9 |
|
@@ -31,4 +32,54 @@ static Value parseLong(Value[] args) { |
31 | 32 | final int radix = (args.length == 2) ? args[1].asInt() : 10; |
32 | 33 | return NumberValue.of(Long.parseLong(args[0].asString(), radix)); |
33 | 34 | } |
| 35 | + |
| 36 | + static Value stripMargin(Value[] args) { |
| 37 | + Arguments.checkOrOr(1, 2, args.length); |
| 38 | + final String input = args[0].asString(); |
| 39 | + final String marginPrefix = (args.length == 2) ? args[1].asString() : "|"; |
| 40 | + if (!input.contains(marginPrefix)) { |
| 41 | + return args[0]; |
| 42 | + } |
| 43 | + final String[] lines = input.split("\\r?\\n"); |
| 44 | + |
| 45 | + // First blank line is omitted |
| 46 | + final StringBuilder sb = new StringBuilder(); |
| 47 | + final int firstLineIndex = (isBlank(lines[0])) ? 1 : 0; |
| 48 | + final int lastLineIndex = lines.length - 1; |
| 49 | + int index = firstLineIndex; |
| 50 | + while (true) { |
| 51 | + sb.append(strip(lines[index], marginPrefix)); |
| 52 | + if (++index >= lastLineIndex) break; |
| 53 | + sb.append('\n'); |
| 54 | + } |
| 55 | + // Process last line |
| 56 | + if (lastLineIndex >= (firstLineIndex + 1) && !isBlank(lines[lastLineIndex])) { |
| 57 | + sb.append('\n').append(strip(lines[lastLineIndex], marginPrefix)); |
| 58 | + } |
| 59 | + return new StringValue(sb.toString()); |
| 60 | + } |
| 61 | + |
| 62 | + private static String strip(String str, String marginPrefix) { |
| 63 | + final int nonBlankIndex = firstNonBlankIndex(str); |
| 64 | + if (str.startsWith(marginPrefix, nonBlankIndex)) { |
| 65 | + return str.substring(nonBlankIndex + marginPrefix.length()); |
| 66 | + } else { |
| 67 | + return str; |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | + private static boolean isBlank(String str) { |
| 72 | + return firstNonBlankIndex(str) == str.length(); |
| 73 | + } |
| 74 | + |
| 75 | + private static int firstNonBlankIndex(String str) { |
| 76 | + final int length = str.length(); |
| 77 | + for (int index = 0; index < length; index++) { |
| 78 | + final char ch = str.charAt(index); |
| 79 | + if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) { |
| 80 | + return index; |
| 81 | + } |
| 82 | + } |
| 83 | + return length; |
| 84 | + } |
34 | 85 | } |
0 commit comments