(cm, ln, pos, dir)
| 3833 | Returns an index object of the new location |
| 3834 | */ |
| 3835 | function forward(cm, ln, pos, dir) { |
| 3836 | var line = cm.getLine(ln); |
| 3837 | var stop = (line === ""); |
| 3838 | |
| 3839 | var curr = { |
| 3840 | line: line, |
| 3841 | ln: ln, |
| 3842 | pos: pos, |
| 3843 | dir: dir, |
| 3844 | } |
| 3845 | |
| 3846 | var last_valid = { |
| 3847 | ln: curr.ln, |
| 3848 | pos: curr.pos, |
| 3849 | } |
| 3850 | |
| 3851 | var skip_empty_lines = (curr.line === ""); |
| 3852 | |
| 3853 | // Move one step to skip character we start on |
| 3854 | nextChar(cm, curr); |
| 3855 | |
| 3856 | while (curr.line !== null) { |
| 3857 | last_valid.ln = curr.ln; |
| 3858 | last_valid.pos = curr.pos; |
| 3859 | |
| 3860 | if (curr.line === "" && !skip_empty_lines) { |
| 3861 | return { ln: curr.ln, pos: curr.pos, }; |
| 3862 | } |
| 3863 | else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { |
| 3864 | return { ln: curr.ln, pos: curr.pos, }; |
| 3865 | } |
| 3866 | else if (isEndOfSentenceSymbol(curr.line[curr.pos]) |
| 3867 | && !stop |
| 3868 | && (curr.pos === curr.line.length - 1 |
| 3869 | || isWhiteSpaceString(curr.line[curr.pos + 1]))) { |
| 3870 | stop = true; |
| 3871 | } |
| 3872 | |
| 3873 | nextChar(cm, curr); |
| 3874 | } |
| 3875 | |
| 3876 | /* |
| 3877 | Set the position to the last non whitespace character on the last |
| 3878 | valid line in the case that we reach the end of the document. |
| 3879 | */ |
| 3880 | var line = cm.getLine(last_valid.ln); |
| 3881 | last_valid.pos = 0; |
| 3882 | for(var i = line.length - 1; i >= 0; --i) { |
| 3883 | if (!isWhiteSpaceString(line[i])) { |
| 3884 | last_valid.pos = i; |
| 3885 | break; |
| 3886 | } |
| 3887 | } |
| 3888 | |
| 3889 | return last_valid; |
| 3890 | |
| 3891 | } |
| 3892 |
no test coverage detected