OK, if it works for you, great. However, I think you might be over complicating it a little. And over complicated code is hard to debug and and even hard to understand what you were doing when you come back to it after some time.
So, firstly, you seem to be substituting a '^' for a LineEnding - I don't see any point in doing that. If your input string unexpectedly contains a '^' it will break your algorithm. My sample code treats a lineending as a lineending, thats what it is.
Just parse the whole string as it is. Search for a #10, thats a newline in any OS you are likely to come across. You don't need to do anything with #13, it really does not mean anything so I drop it on the floor. You 'should' almost never come across a #13 by itself in a text file. So that would simplify your code somewhat.
Searching for the next #10 and using library functions to extract the text component is probably a little faster than my simpler way of iterating over exery char in the string but I don't think you will see a difference unless your input string is more than, say, 20K. But your way is pretty good anyway.
Next, I reckon a case statement might be a better way to handle ColourTextBlock(), it does make for code that is somewhat easier to write and a lot easier to read later on. But if you are happy with it as it is, stick with it !
And, this is purely a personal thing, I don't like single letter variable names. Var names should remind you what they are going to be used for. Generally .....
Davo