let do_register_transforms () = begin
regt (t_q3uiip false) "q3_uioip" "Extracts IP from q3 userinfo string" "\nThis transform only retains the IP from lines with a \nuserinfo string.\n \nSee q3_uiip if you want to retain a copy of the original line.";
regt (t_q3uiip true) "q3_uiip" "Separate IP from q3 userinfo string" "\nThis transform is meant to be used in conjunction with its homonym predicate.\nIt isolates the IP from a userinfo string, and displays it clearly.\n \nThe original string is also entirely displayed after the IP.\n \nThere is another transform which prints the IP alone: q3_uioip";
regt t_rcut80 "rcut80" "Truncate to the last 80 characters" "\nThis transform only keeps the LAST 80 characters of each line, which allows\nthe resulting text to be printed on any terminal without any line break.\n \nInformation can be lost, though.\n \nThis transform has a sister: see cut80";
regt t_cut80 "cut80" "Truncate to the first 80 characters" "\nThis transform only keeps the FIRST 80 characters of each line, which allows\nthe resulting text to be printed on any terminal without any line break.\n \nInformation can be lost, though.\n \nThis transform has a sister: see rcut80";
regt t_jk_event "jk_event" "Jedi Knight localised event trim" "\nThis transform removes the \"broadcast: print\" instruction\nand the quotes from lines containing a localised game event.\n \nSee the homonym predicate for more information.";
regt remove_q3colors "noq3cols" "Remove Quake3 colour escapes" "\nIn Quake3-based games, the character ^ is the 'colour escape' which, combined\nwith a number, changes the current colour. \n \nOf course, since the colours won't be displayed in text logs, these can\nbecome an annoyance.\n \nThese transform removes any colour escape it finds. For instance\n ^5G^7amall ^5W^7ednesday ^5I^7da^7\nbecomes\n Gamall Wednesday Ida.";
regt t_jk_dlgs "jk_dlgs" "Jedi Knight dialogue line pretty-print" "\nThis transform is to be used with the jk_dlgs, jk_adlgs and jk_pdlgs \npredicates.\n \nIt separates the names and the dialogues very clearly, using different templates\nfor public and private messages.\n \nTip: rather than use \n -t jk_dlgs -p jk_adlgs\n, you can use\n -t jk_dlgs --no-blank\n \nSince this transform will yield a blank line if it fails, those two commands\nare identical, except the second one only matches the regular expressions\none time, while the first does it twice. So the second command is a tad faster\nthan the first.";
regt t_debugmark "mark" "Debug mark. Prepends a mark" "\nThis basic transform will just add 'MARKED: ' at the beginning of its input.\n \nIt has no practical use except for debugging the program.";
regt String.uppercase "upcase" "To uppercase" "\nThis transform turns its input to uppercase.\n \nI don't think it is of much use, but I put it here for the sake of example, to \nshow how easy it is to add a transform to the program.\n \nBesides, this was one of the example filters I shipped with SIS.";
regt String.lowercase "lcase" "To lowercase" "\nThis transform turns its input to lowercase.\n \nSince I has included uppercase (see upcase), I couldn't possibly omit \nlowercase...";
regt t_id "id" "Identity. lines are unaltered (DEFAULT)" "\nThis transform is the identity: its input is unaltered.\n \nThis is the default transform, which means it will be used unless you select\nanother one.\n \nThis allows you to use the filter with a predicate alone."
end