Difference between revisions of "ReNamer:Scripts:RegEx Case Convertion"

From den4b Wiki
Jump to navigation Jump to search
(Replaced the use of TStringsArray with TWideStringArray.)
(Bumped up version requirements)
Line 7: Line 7:
 
== Tested ==
 
== Tested ==
  
* ReNamer 5.50
+
* ReNamer 5.74.4 Beta
  
 
== Code ==
 
== Code ==

Revision as of 11:40, 5 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.