About the new feature:
* Go to http://phorge.localhost/P1, click on line number 11, see that highlighting still works and URL in the address bar becomes http://phorge.localhost/P1#L11 without a page reload
* Access URL http://phorge.localhost/P1#L13 and see that position scrolling by the browser works as expected
* Go to http://phorge.localhost/P1, click on line number 11 and drag to number 17, see that highlighting still works as before and URL in the address bar becomes http://phorge.localhost/P1#L11-17
* Go to http://phorge.localhost/P1#L11-17 directly, still works
* Go to http://phorge.localhost/P1#L17-11 (that is, first 17, then 11) and you just highlighted from line 11 to 17 successfully, like above, no nuclear crash
* Go to http://phorge.localhost/P1#LMIAAAO and really nothing special happens, no crash, just a nonsense web fragment
* Go to http://phorge.localhost/P1#L2-99999999999 and you highlight only the existing lines, without JavaScript burnout
About possible regressions:
* Access URL http://phorge.localhost/P1$9 and see that highlighting and position scrolling by the server-side JS still works as expected
* Access URL http://phorge.localhost/P1$9-16 and see that highlighting and position scrolling by the server-side JS still works as expected
* Access URL http://phorge.localhost/P1$16-9, same as above
* Access the above legacy URIs and click again on another line number, e.g. 2, and you get the new URIs with fragments (no silly things like `P1$9#2`, but just `P1#L2`)
----
For both, perform the same tests in a source code file rendered in Diffusion. Same results.
----
As additional test, you can define the new JavaScript functions in your browser console. E.g. copy-pasting this:
```javascript
var _parseLineNumber = function(vRaw) { ....
var parseMinMaxSelectedLineFromFragment = function(input) { ...
```
Then, test if JavaScript can recognize the fragment interval:
```
$ parseMinMaxSelectedLineFromFragment("L123")
Array [ 123, 123 ]
```
```
$ parseMinMaxSelectedLineFromFragment("L2-50")
Array [ 2, 50 ]
```
```
$ parseMinMaxSelectedLineFromFragment("L50-2")
Array [ 2, 50 ]
```
```
$ parseMinMaxSelectedLineFromFragment("L50-2")
Array [ 2, 50 ]
```
Also test some nonsense inputs, and they successfully crash:
```lang=javascript,counterexample
$ // Test nonsense line.
$ parseMinMaxSelectedLineFromFragment("LMIAO")
Uncaught Input fragment parts must be positive integer. Got: MIAO debugger eval code:11:70
_parseLineNumber debugger eval code:11
parseMinMaxSelectedLineFromFragment debugger eval code:42
```
```lang=javascript,counterexample
$ // Test nonsense zero line.
$ parseMinMaxSelectedLineFromFragment("L123-0")
Uncaught Input fragment parts must be positive integer. Got: 0 debugger eval code:11:70
_parseLineNumber debugger eval code:11
parseMinMaxSelectedLineFromFragment debugger eval code:43
```
```lang=javascript,counterexample
$ // Test nonsense negative line.
$ parseMinMaxSelectedLineFromFragment("L-123")
Uncaught Input fragment parts must be positive integer. Got: debugger eval code:11:70
_parseLineNumber debugger eval code:11
parseMinMaxSelectedLineFromFragment debugger eval code:42
```
Note: these crashes are __not__ shown to end-users while using Phorge. These exceptions are only for test plan lovers, and for developers.
So we recognize correct web fragments, and discard nonsense ones. Giving backward compatibility.