Difference between revisions of "ReNamer:Scripts:RegEx Case Convertion"
Jump to navigation
Jump to search
(→Code 2: fixed extra long code lines) |
m (Text replacement - "</source>" to "</syntaxhighlight>") |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{Up|ReNamer:Scripts}} | ||
+ | |||
The script compensates for the lack of the ability of ReNamer's RegEx engine to change case of groups captured by RegEx. | 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. | 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. | ||
Line 6: | Line 7: | ||
== Tested == | == Tested == | ||
− | * ReNamer 5. | + | * ReNamer 5.74.4 Beta |
== Code == | == Code == | ||
Line 12: | Line 13: | ||
Author: krtek. Date: 26 July 2009. | Author: krtek. Date: 26 July 2009. | ||
− | < | + | <syntaxhighlight lang="pascal"> |
const | const | ||
Line 50: | Line 51: | ||
var | var | ||
− | Matches, SubPatterns : | + | Matches, SubPatterns : TWideStringArray; |
TempFilename, FileNameProcessedPart : WideString; | TempFilename, FileNameProcessedPart : WideString; | ||
start_pos, end_pos, i, j : Integer; | start_pos, end_pos, i, j : Integer; | ||
Line 142: | Line 143: | ||
else | else | ||
begin | begin | ||
− | + | WideShowMessage('The value of CHANGE_CASE constant is invalid. Check legend for info.'); | |
TimeToExit:=True; | TimeToExit:=True; | ||
break; | break; | ||
Line 185: | Line 186: | ||
end. | end. | ||
− | </ | + | </syntaxhighlight> |
− | |||
== Code 2 == | == 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. | Author: krtek & Stefan. Date: 27 July 2009. | ||
− | < | + | <syntaxhighlight lang="pascal"> |
const | const | ||
Line 203: | Line 205: | ||
− | DEFAULT_REGEX = '(.+) - (.+) - (.+)'; //exchanged with | + | DEFAULT_REGEX = '(.+) - (.+) - (.+)'; //exchanged with InputQuery |
DEFAULT_CHANGE_CASE = '102'; | DEFAULT_CHANGE_CASE = '102'; | ||
Line 230: | Line 232: | ||
var | var | ||
− | Matches, SubPatterns : | + | Matches, SubPatterns : TWideStringArray; |
TempFilename, FileNameProcessedPart : WideString; | TempFilename, FileNameProcessedPart : WideString; | ||
start_pos, end_pos, i: Integer; | start_pos, end_pos, i: Integer; | ||
Line 367: | Line 369: | ||
else | else | ||
begin | begin | ||
− | + | WideShowMessage('The value of ChangeCase parameter is invalid.' +#10+ | |
'ChangeCase string cannot contain '+inttostr(CaseFlag)+ '.'+#10+ | 'ChangeCase string cannot contain '+inttostr(CaseFlag)+ '.'+#10+ | ||
'Check legend for info.' +#10 +#10 +'Script will be terminated.'); | 'Check legend for info.' +#10 +#10 +'Script will be terminated.'); | ||
Line 413: | Line 415: | ||
end. | end. | ||
− | </ | + | </syntaxhighlight> |
Latest revision as of 15:03, 8 February 2017
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.
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 didn''t 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.
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.
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 = 'krtek''s 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 didn''t 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.