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

From den4b Wiki
Jump to navigation Jump to search
(→‎Code: fixed extra long code lines)
m (Text replacement - "</source>" to "</syntaxhighlight>")
 
(8 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.50
+
* ReNamer 5.74.4 Beta
  
 
== Code ==
 
== Code ==
Line 12: Line 13:
 
Author: krtek. Date: 26 July 2009.
 
Author: krtek. Date: 26 July 2009.
  
<source>
+
<syntaxhighlight lang="pascal">
 
const
 
const
  
Line 50: Line 51:
  
 
var
 
var
   Matches, SubPatterns : TStringsArray;
+
   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   
             ShowMessage('The value of CHANGE_CASE constant is invalid. Check legend for info.');
+
             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.
</source>
+
</syntaxhighlight>
  
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.
 
  
 
== 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.
  
<source>
+
<syntaxhighlight lang="pascal">
 
const
 
const
  
Line 203: Line 205:
 
          
 
          
  
DEFAULT_REGEX = '(.+) - (.+) - (.+)';  //exchanged with InputBox
+
DEFAULT_REGEX = '(.+) - (.+) - (.+)';  //exchanged with InputQuery
 
DEFAULT_CHANGE_CASE = '102';   
 
DEFAULT_CHANGE_CASE = '102';   
  
Line 216: Line 218:
 
//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 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.  
 
//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.
+
//eg. '102' means that first matched brackets will be uppercased,
 
+
//second - won't be changed and third (and every brackets after it) - lowercased.
  
  
Line 230: Line 232:
  
 
var
 
var
   Matches, SubPatterns : TStringsArray;
+
   Matches, SubPatterns : TWideStringArray;
 
   TempFilename, FileNameProcessedPart : WideString;
 
   TempFilename, FileNameProcessedPart : WideString;
 
   start_pos, end_pos, i: Integer;
 
   start_pos, end_pos, i: Integer;
Line 275: Line 277:
 
     ChangeCase := DEFAULT_CHANGE_CASE;
 
     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  
+
   If not WideInputQuery(SCRIPT_NAME, 'Choose case for every single match group ( )'+#10+
 +
    'of your RegEx:' +#10 + Regex +#10 +#10 + Info, ChangeCase ) then  
 
   begin
 
   begin
 
     TimeToExit := true;
 
     TimeToExit := true;
 
     exit;
 
     exit;
 
   end;
 
   end;
 
  
 
end;
 
end;
Line 317: Line 319:
 
   Initialized:=true;
 
   Initialized:=true;
 
end;
 
end;
 
  
  
 
begin
 
begin
 
 
 
    
 
    
 
if not TimeToExit then
 
if not TimeToExit then
Line 364: Line 364:
 
         3 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i]);
 
         3 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i]);
 
         4 : TempFilename:=TempFileName+WideCaseInvert(SubPatterns[i]);
 
         4 : TempFilename:=TempFileName+WideCaseInvert(SubPatterns[i]);
         5 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i][1])+WideLowerCase(WideCopy(SubPatterns[i], 2, Length(SubPatterns[i])-1));
+
         5 : TempFilename:=TempFileName+WideUpperCase(SubPatterns[i][1])+
 +
              WideLowerCase(WideCopy(SubPatterns[i], 2, Length(SubPatterns[i])-1));
 
            
 
            
 
         else
 
         else
 
           begin   
 
           begin   
             ShowMessage('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.');
+
             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;
 
             TimeToExit:=True;
 
             break;
 
             break;
Line 378: Line 381:
 
    
 
    
 
   if start_pos < Length(FileNameProcessedPart) then
 
   if start_pos < Length(FileNameProcessedPart) then
     TempFilename:=TempFileName+WideCopy(FileNameProcessedPart, start_pos, Length(FileNameProcessedPart)-start_pos+1);
+
     TempFilename:=TempFileName+WideCopy(FileNameProcessedPart,
 +
      start_pos, Length(FileNameProcessedPart)-start_pos+1);
 
   
 
   
  
Line 384: Line 388:
 
     if CheckIfFullMatch then     
 
     if CheckIfFullMatch then     
 
       begin
 
       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
+
         if not WideInputQuery('RegEx didn''t match the full filename.',
          exit
+
          '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  
 
         else if WideSameText(WideLowerCase(Answer),BREAK_STRING) then  
 
           begin
 
           begin
Line 399: Line 407:
 
       end;
 
       end;
 
    
 
    
 
 
   if SKIP_EXTENTION then   
 
   if SKIP_EXTENTION then   
 
     FileName:=TempFileName+WideExtractFileExt(FileName)
 
     FileName:=TempFileName+WideExtractFileExt(FileName)
 
   else FileName:=TempFileName;
 
   else FileName:=TempFileName;
 
 
  
 
end
 
end
Line 409: Line 415:
 
   
 
   
 
end.
 
end.
</source>
+
</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.