Help for syntax highlighting
-
I did a little bit of research in Google and the forum, but can’t find a sollution so far.
I often work with files like these:
hh:mm:ss;Fehlernr.;Index;aktiv;CPU;Beschreibung;Par1;Par2;Par3;Par4;Information;
76.533:22:14;21;1;0;A;“Error1”;1;0;21001;322;2;
76.533:22:14;21;1;0;B;“Error1”;1;0;21001;322;4;
76.533:19:51;21;1;0;A;“Error1”;1;0;21001;5337;2;
76.533:19:40;21;1;0;A;“Error1”;1;0;21001;5337;2;
76.533:19:21;21;1;0;A;“Error1”;1;0;21001;5337;2;
76.533:18:46;31;7;0;A;“Error2”;0;0;31007;503;2;
76.533:18:33;31;7;0;A;“Error2”;0;0;31007;503;2;
60:12:02;26;4;0;A;“Error3”;0;0;26004;0;2;
60:12:02;26;3;0;A;“Error3”;0;0;26003;2110;2;
42:58:01;21;1;0;B;“Error1”;1;0;21001;322;4;
42:57:20;21;1;0;A;“Error1”;1;0;21001;322;2;
42:15:00;4;1;0;B;“Error4”;-32;-32000;4001;2597752;4;
42:15:00;4;1;0;A;“Error4”;-32;-32000;4001;2597752;2;It would be really helpful if I could split these strings in different blocks and also colour them differently, to make it more readable.
Best would be, if it would also stretch it out a little bit, that it becomes a little bit like a table.
Is that possible with the UDL? -
Hello Marco Bimbös,
afaik, UDL cannot help you here.
What could be done, in regards to formatting, is to use the Python Script plugin and a little script.
I’have written here what needs to be done first.Regarding colorizing, it could be done but I don’t think a python script would be a good solution.
From what I understand, colorizing is done when you activate a new document, repeatedly but
a script runs once, normally.
If you use callbacks like BUFFERACTIVATED then you need to take care that there is a logical
way when the script should be executed and when not.
Lastly, the addStyledText function is not that fast. Colorizing 100 lines of your provided sample
takes up to 3 seconds.So, a python script could look like this
a = [[] for x in editor.getLine(0).split(";")] # create a list of lists using the first line in the doc def ssv_to_list(cont, l_num, tot_lines): # convert semicolon separated values to a list cont = cont.split(";") for n in range(len(cont)): a[n].append(cont[n].replace("\r\n", "")) editor.forEachLine(ssv_to_list) # well, self explaining I guess aLens = [max([len(x) for x in a[y]]) for y in range(len(a))] # find out what the biggest string is def format_line(l_num): # format the lines txt = '' spacer = 1 # can be used to increace space between columns for x in range(len(aLens) - 1): # loop if x == 4 : # your example used one left justified column txt += "{0:<{1}}".format(' ',spacer) + a[x][l_num].ljust(aLens[x]) else: # right justified txt += a[x][l_num].rjust(aLens[x]+spacer) return txt + '\r\n' # add line breaks notepad.new() # open a new doc big_txt = '' for l in range(len(a[0])): # loop through the list of lists saved in ssv_to_list big_txt += format_line(l) # create the new formatted text editor.addText(big_txt) # add it to editor.
Cheers
Claudia -
Nice job Claudia. I actually tried this out. The only (slight) negative is the x==4 part, which binds it to the data set rather tightly (but that was what the user wanted). I could see this being used to do a quick reformat on CSV data with a few tweaks. Again, good job.
-
Hello Scott,
thank you for your kind words, you are right, this script, as it is, is only useful
if you have a data set similar to the one Marco has.
For those who want to have a more general solution replace the format_line
function with this onedef format_line(l_num): txt = '' spacer = 1 for x in range(len(aLens) - 1): txt += a[x][l_num].rjust(aLens[x]+spacer) return txt + '\r\n'
Cheers
Claudia