(cm, ln, pos, dir)
| 3895 | Returns an index object of the new location |
| 3896 | */ |
| 3897 | function reverse(cm, ln, pos, dir) { |
| 3898 | var line = cm.getLine(ln); |
| 3899 | |
| 3900 | var curr = { |
| 3901 | line: line, |
| 3902 | ln: ln, |
| 3903 | pos: pos, |
| 3904 | dir: dir, |
| 3905 | } |
| 3906 | |
| 3907 | var last_valid = { |
| 3908 | ln: curr.ln, |
| 3909 | pos: null, |
| 3910 | }; |
| 3911 | |
| 3912 | var skip_empty_lines = (curr.line === ""); |
| 3913 | |
| 3914 | // Move one step to skip character we start on |
| 3915 | nextChar(cm, curr); |
| 3916 | |
| 3917 | while (curr.line !== null) { |
| 3918 | |
| 3919 | if (curr.line === "" && !skip_empty_lines) { |
| 3920 | if (last_valid.pos !== null) { |
| 3921 | return last_valid; |
| 3922 | } |
| 3923 | else { |
| 3924 | return { ln: curr.ln, pos: curr.pos }; |
| 3925 | } |
| 3926 | } |
| 3927 | else if (isEndOfSentenceSymbol(curr.line[curr.pos]) |
| 3928 | && last_valid.pos !== null |
| 3929 | && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { |
| 3930 | return last_valid; |
| 3931 | } |
| 3932 | else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { |
| 3933 | skip_empty_lines = false; |
| 3934 | last_valid = { ln: curr.ln, pos: curr.pos } |
| 3935 | } |
| 3936 | |
| 3937 | nextChar(cm, curr); |
| 3938 | } |
| 3939 | |
| 3940 | /* |
| 3941 | Set the position to the first non whitespace character on the last |
| 3942 | valid line in the case that we reach the beginning of the document. |
| 3943 | */ |
| 3944 | var line = cm.getLine(last_valid.ln); |
| 3945 | last_valid.pos = 0; |
| 3946 | for(var i = 0; i < line.length; ++i) { |
| 3947 | if (!isWhiteSpaceString(line[i])) { |
| 3948 | last_valid.pos = i; |
| 3949 | break; |
| 3950 | } |
| 3951 | } |
| 3952 | return last_valid; |
| 3953 | } |
| 3954 |
no test coverage detected