ReNamer:Scripts:RegEx Case Convertion
The script compensates for the lack of the ability of ReNamer's RegEx engine to change case of groups captured by RegEx.
User needs to provide REGEX and CHANGE_CASE parameters to the script controls. The exact form of the CHANGE_CASE string is explained in the legend below the main controls.
Tested
- ReNamer 5.74.4 Beta
Code
Author: krtek. Date: 26 July 2009.
<syntaxhighlight lang="pascal"> const
//SCRIPT CONTROLS:
REGEX = '(.+) - (.+) - (.+)'; CHANGE_CASE = '102';
SKIP_EXTENTION = true; //true or false CASE_SENSITIVE = False; //Should searching with regex be case sensitive? Default: False FULL_MATCH_CHECK = True; //Should the script warn you if regex didn't match the full filename? Default: True;
//Legend for CHANGE_CASE parameter:
//1. Capitalize Every Word
//2. lowercase
//3. UPPERCASE
//4. iNVERT cASE
//5. First letter capital
//0. No changes
//You may specify case for every capturing group (brackets) in regex as a string of appropriate digits.
//If the CHANGE_CASE string is shorten then number of capturing groups then the last digit is used till the end of regex.
//If the CHANGE_CASE string is longer, spare digits are ignored.
//eg. '102' means that first matched brackets will be uppercased,
// second - won't be changed and third (and every brackets after it) - lowercased.
//END OF SCRIPT CONTROLS
BREAK_STRING = 'BREAK';
FOR_ALL_STRING = 'DO NOT ASK';
STANDARD_ANSWER = BREAK_STRING+' to exit, '+FOR_ALL_STRING+' to continue';
var
Matches, SubPatterns : TWideStringArray; TempFilename, FileNameProcessedPart : WideString; start_pos, end_pos, i, j : Integer; Initialized, TimeToExit, NotAFullMatch, CheckIfFullMatch : Boolean; CaseFlags : array of Integer; CaseFlag : Integer; Answer : WideString;
function SetCaseFlags(s : WideString) : array of Integer;
var
i : Integer;
LoopEnd : Integer;
CaseIDs : array of Integer;
begin
SetLength(CaseIDs,Length(s)); LoopEnd:=Length(s)-1; for i:=0 to LoopEnd do begin CaseIDs[i]:= StrToInt(WideCopy(s,1,1)); s:=WideCopy(s,2,Length(s)-1); end;
result:= CaseIDs;
end;
procedure Initialize;
begin
Answer:=STANDARD_ANSWER; CheckIfFullMatch:=FULL_MATCH_CHECK; Initialized:=true; CaseFlags:=SetCaseFlags(CHANGE_CASE);
end;
begin
if not TimeToExit then begin
if not Initialized then Initialize;
TempFilename:=; end_pos:=0; start_pos:=1; SetLength(SubPatterns,0); SetLength(Matches,0); NotAFullMatch:=false; if SKIP_EXTENTION then FileNameProcessedPart:=WideStripExtension(FileName) else FileNameProcessedPart:=FileName; Matches:=MatchesRegEx(FileNameProcessedPart, REGEX, CASE_SENSITIVE); if Length(Matches) <= 0 then exit; if Matches[0] <> FileNameProcessedPart then NotAFullMatch:=true; SubPatterns:=SubMatchesRegEx(Matches[0],REGEX,CASE_SENSITIVE); if Length(SubPatterns) <=0 then exit; for i:=0 to Length(SubPatterns)-1 do if SubPatterns[i]<> then begin end_pos:=WidePos(SubPatterns[i], Matches[0])-1; TempFileName:=TempFileName+WideCopy(Matches[0], start_pos, end_pos-start_pos+1); start_pos:=end_pos+Length(SubPatterns[i])+1;
if i < length(CaseFlags) then CaseFlag:=CaseFlags[i] else CaseFlag:=CaseFlags[Length(CaseFlags)-1]; case CaseFlag of 0 : TempFilename:=TempFileName+SubPatterns[i]; 1 : TempFilename:=TempFileName+WideCaseCapitalize(SubPatterns[i]); 2 : TempFilename:=TempFileName+WideLowerCase(SubPatterns[i]); 3 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i]); 4 : TempFilename:=TempFileName+WideCaseInvert(SubPatterns[i]); 5 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i][1])+ WideLowerCase(WideCopy(SubPatterns[i], 2, Length(SubPatterns[i])-1)); else begin WideShowMessage('The value of CHANGE_CASE constant is invalid. Check legend for info.'); TimeToExit:=True; break; end; end;
end; if start_pos < Length(FileNameProcessedPart) then TempFilename:=TempFileName+WideCopy(FileNameProcessedPart, start_pos, Length(FileNameProcessedPart)-start_pos+1);
if NotAFullMatch then if CheckIfFullMatch then begin if not WideInputQuery('RegEx didnt match the full filename.', 'Old filename:'+#10+FileName+#10+#10+ 'Proposed new filename: '+#10+TempFileName+WideExtractFileExt(FileName)+#10+#10+ 'What should we do?'#10+#10+'Pressing OK button = Rename that file'+#10+ 'Pressing Cancek button = Skip that file'+#10+'Type +BREAK_STRING+ in the text field to exit the script or +FOR_ALL_STRING+ if you want to continue with all the files.'+#10, Answer) then Exit else if WideSameText(WideLowerCase(Answer),BREAK_STRING) then begin TimeToExit:=True; exit; end else if WideSameText(WideLowerCase(Answer),FOR_ALL_STRING) then begin CheckIfFullMatch:=False; end else Answer:=STANDARD_ANSWER; end;
if SKIP_EXTENTION then FileName:=TempFileName+WideExtractFileExt(FileName) else FileName:=TempFileName;
end else exit;
end. </source>
Code 2
Thanks to the Stefan's involvement there exists also a version of the script that uses dialog boxes to ask user for required data so no direct changes to the script are needed.
Author: krtek & Stefan. Date: 27 July 2009.
<syntaxhighlight lang="pascal"> const
//SCRIPT CONTROLS:
SKIP_EXTENTION = true; //true or false CASE_SENSITIVE = False; //Should searching with regex be case sensitive? Default: False FULL_MATCH_CHECK = True; //Should the script warn you if regex didn't match the full filename? Default: True;
DEFAULT_REGEX = '(.+) - (.+) - (.+)'; //exchanged with InputQuery
DEFAULT_CHANGE_CASE = '102';
//Legend for CHANGE_CASE parameter: //0. No changes //1. Capitalize Every Word //2. lowercase //3. UPPERCASE //4. iNVERT cASE //5. First letter capital //You may specify case for every capturing group (brackets) in regex as a string of appropriate digits. //If the CHANGE_CASE string is shorten then number of capturing groups then the last digit is used till the end of regex. //If the CHANGE_CASE string is longer, spare digits are ignored. //eg. '102' means that first matched brackets will be uppercased, //second - won't be changed and third (and every brackets after it) - lowercased.
//END OF SCRIPT CONTROLS
BREAK_STRING = 'BREAK';
FOR_ALL_STRING = 'DO NOT ASK';
STANDARD_ANSWER = BREAK_STRING+' to exit, '+FOR_ALL_STRING+' to continue';
SCRIPT_NAME = 'krteks CaseChanger';
var
Matches, SubPatterns : TWideStringArray; TempFilename, FileNameProcessedPart : WideString; start_pos, end_pos, i: Integer; Initialized, TimeToExit, NotAFullMatch, CheckIfFullMatch : Boolean; CaseFlags : array of Integer; CaseFlag : Integer; Answer, Regex, ChangeCase, Info : WideString;
function BoolToStr(condition : boolean) : WideString;
begin
If condition Then result := 'True' Else result := 'False';
end;
procedure procGetUserInput;
begin
Info := Info + #10 + 'Note: check script source for this settings:' +#10 Info := Info + 'SKIP_EXTENTION: ' + #9 + BoolToStr(SKIP_EXTENTION) +#10 Info := Info + 'CASE_SENSITIVE: ' + #9 + BoolToStr(CASE_SENSITIVE) +#10 Info := Info + 'FULL_MATCH_CHECK: ' + #9 + BoolToStr(FULL_MATCH_CHECK) +#10 Regex:=DEFAULT_REGEX; If not WideInputQuery(SCRIPT_NAME, 'Match this RegEx on file name:' +#10 +Info, Regex) then begin TimeToExit := true; exit; end; Info := '0. No changes' +#10 Info := Info + '1. Capitalize Every Word' +#10 Info := Info + '2. lowercase' +#10 Info := Info + '3. UPPERCASE' +#10 Info := Info + '4. iNVERT cASE' +#10 Info := Info + '5. First letter capital' +#10 +#10 Info := Info + 'F.ex.:' +#9 + 'use case type 1 for first match ( ),' +#10 +#9 Info := Info + '0 for second and 3 for third' +#10 +#9 + '=> 103' +#10 +#10 ChangeCase := DEFAULT_CHANGE_CASE; If not WideInputQuery(SCRIPT_NAME, 'Choose case for every single match group ( )'+#10+ 'of your RegEx:' +#10 + Regex +#10 +#10 + Info, ChangeCase ) then begin TimeToExit := true; exit; end;
end;
function SetCaseFlags(s : WideString) : array of Integer; var i : Integer; LoopEnd : Integer; CaseIDs : array of Integer;
begin
SetLength(CaseIDs,Length(s)); LoopEnd:=Length(s)-1; for i:=0 to LoopEnd do begin CaseIDs[i]:= StrToInt(WideCopy(s,1,1)); s:=WideCopy(s,2,Length(s)-1); end;
result:= CaseIDs;
end;
procedure Initialize;
begin
Answer:=STANDARD_ANSWER; CheckIfFullMatch:=FULL_MATCH_CHECK; FilePath := 'not used'; //just to shut up the compiler procGetUserInput; CaseFlags:=SetCaseFlags(ChangeCase); Initialized:=true;
end;
begin
if not TimeToExit then begin
if not Initialized then Initialize; TempFilename:=; end_pos:=0; start_pos:=1; SetLength(SubPatterns,0); SetLength(Matches,0); NotAFullMatch:=false; if SKIP_EXTENTION then FileNameProcessedPart:=WideStripExtension(FileName) else FileNameProcessedPart:=FileName;
Matches:=MatchesRegEx(FileNameProcessedPart, Regex, CASE_SENSITIVE); if Length(Matches) <= 0 then exit; if Matches[0] <> FileNameProcessedPart then NotAFullMatch:=true; SubPatterns:=SubMatchesRegEx(Matches[0],Regex,CASE_SENSITIVE); if Length(SubPatterns) <=0 then exit; for i:=0 to Length(SubPatterns)-1 do if SubPatterns[i]<> then begin end_pos:=WidePos(SubPatterns[i], Matches[0])-1; TempFileName:=TempFileName+WideCopy(Matches[0], start_pos, end_pos-start_pos+1); start_pos:=end_pos+Length(SubPatterns[i])+1; if i < length(CaseFlags) then CaseFlag:=CaseFlags[i] else CaseFlag:=CaseFlags[Length(CaseFlags) -1]; case CaseFlag of 0 : TempFilename:=TempFileName+SubPatterns[i]; 1 : TempFilename:=TempFileName+WideCaseCapitalize(SubPatterns[i]); 2 : TempFilename:=TempFileName+WideLowerCase(SubPatterns[i]); 3 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i]); 4 : TempFilename:=TempFileName+WideCaseInvert(SubPatterns[i]); 5 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i][1])+ WideLowerCase(WideCopy(SubPatterns[i], 2, Length(SubPatterns[i])-1)); else begin WideShowMessage('The value of ChangeCase parameter is invalid.' +#10+ 'ChangeCase string cannot contain '+inttostr(CaseFlag)+ '.'+#10+ 'Check legend for info.' +#10 +#10 +'Script will be terminated.'); TimeToExit:=True; break; end; end;
end; if start_pos < Length(FileNameProcessedPart) then TempFilename:=TempFileName+WideCopy(FileNameProcessedPart, start_pos, Length(FileNameProcessedPart)-start_pos+1);
if NotAFullMatch then if CheckIfFullMatch then begin if not WideInputQuery('RegEx didnt match the full filename.', 'Old filename:'+#10+FileName+#10+#10+'Proposed new filename: '+#10+ TempFileName+WideExtractFileExt(FileName)+#10+#10+'What should we do?'#10+#10+ 'Pressing OK button = Rename that file'+#10+'Pressing Cancek button = Skip that file'+#10+ 'Type +BREAK_STRING+ in the text field to exit the script or +FOR_ALL_STRING+ if you want to continue with all the files.'+#10, Answer) then Exit else if WideSameText(WideLowerCase(Answer),BREAK_STRING) then begin TimeToExit:=True; exit; end else if WideSameText(WideLowerCase(Answer),FOR_ALL_STRING) then begin CheckIfFullMatch:=False; end else Answer:=STANDARD_ANSWER; end; if SKIP_EXTENTION then FileName:=TempFileName+WideExtractFileExt(FileName) else FileName:=TempFileName;
end else exit;
end. </source>