OSDN Git Service

editor addmin.sc: Add ReverseColumns, ReverseLines and Replace function
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sat, 26 Jun 2021 08:21:55 +0000 (17:21 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sat, 26 Jun 2021 08:21:55 +0000 (17:21 +0900)
44 files changed:
ALL.vs2017.sln
ALL.vs2019.sln
Plugins/dlls/editor addin.sct
Src/Merge.rc
Testing/PluginTests/PluginTests.vbs
Translations/TranslationsStatus.html
Translations/TranslationsStatus.md
Translations/TranslationsStatus.xml
Translations/WinMerge/Arabic.po
Translations/WinMerge/Basque.po
Translations/WinMerge/Brazilian.po
Translations/WinMerge/Bulgarian.po
Translations/WinMerge/Catalan.po
Translations/WinMerge/ChineseSimplified.po
Translations/WinMerge/ChineseTraditional.po
Translations/WinMerge/Croatian.po
Translations/WinMerge/Czech.po
Translations/WinMerge/Danish.po
Translations/WinMerge/Dutch.po
Translations/WinMerge/English.pot
Translations/WinMerge/Finnish.po
Translations/WinMerge/French.po
Translations/WinMerge/Galician.po
Translations/WinMerge/German.po
Translations/WinMerge/Greek.po
Translations/WinMerge/Hungarian.po
Translations/WinMerge/Italian.po
Translations/WinMerge/Japanese.po
Translations/WinMerge/Korean.po
Translations/WinMerge/Lithuanian.po
Translations/WinMerge/Norwegian.po
Translations/WinMerge/Persian.po
Translations/WinMerge/Polish.po
Translations/WinMerge/Portuguese.po
Translations/WinMerge/Romanian.po
Translations/WinMerge/Russian.po
Translations/WinMerge/Serbian.po
Translations/WinMerge/Sinhala.po
Translations/WinMerge/Slovak.po
Translations/WinMerge/Slovenian.po
Translations/WinMerge/Spanish.po
Translations/WinMerge/Swedish.po
Translations/WinMerge/Turkish.po
Translations/WinMerge/Ukrainian.po

index 62a52f8..b98f393 100644 (file)
@@ -334,6 +334,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "q", "q", "{E4EF583F-653D-44
                Plugins\Commands\q\q.bat = Plugins\Commands\q\q.bat
        EndProjectSection
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PluginTests", "PluginTests", "{9738877F-0B01-4C37-855E-7465C5AB7B56}"
+       ProjectSection(SolutionItems) = preProject
+               Testing\PluginTests\PluginTests.vbs = Testing\PluginTests\PluginTests.vbs
+       EndProjectSection
+EndProject
 Global
        GlobalSection(SharedMSBuildProjectFiles) = preSolution
                Externals\gtest\gtest.vcxitems*{0a3727b1-51e7-4702-ad0c-8aee317ea510}*SharedItemsImports = 4
@@ -1042,6 +1047,7 @@ Global
                {BB290B2D-F5B9-4552-AE32-9319C03E41C0} = {AA9C3A4D-4CD6-46BE-A266-A5FE7BE52F65}
                {5DADCF29-6A44-4AD1-8E42-DCB162A1907D} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
                {E4EF583F-653D-4445-A649-555C8AD730E7} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
+               {9738877F-0B01-4C37-855E-7465C5AB7B56} = {14FC5F77-041C-49BF-B28F-F976EC6F253C}
        EndGlobalSection
        GlobalSection(ExtensibilityGlobals) = postSolution
                SolutionGuid = {CC2E4F75-FADC-4F44-BD62-47A321828081}
index d1a49c0..0f0187d 100644 (file)
@@ -334,6 +334,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "q", "q", "{E4EF583F-653D-44
                Plugins\Commands\q\q.bat = Plugins\Commands\q\q.bat
        EndProjectSection
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PluginTests", "PluginTests", "{9738877F-0B01-4C37-855E-7465C5AB7B56}"
+       ProjectSection(SolutionItems) = preProject
+               Testing\PluginTests\PluginTests.vbs = Testing\PluginTests\PluginTests.vbs
+       EndProjectSection
+EndProject
 Global
        GlobalSection(SharedMSBuildProjectFiles) = preSolution
                Externals\gtest\gtest.vcxitems*{0a3727b1-51e7-4702-ad0c-8aee317ea510}*SharedItemsImports = 4
@@ -1042,6 +1047,7 @@ Global
                {BB290B2D-F5B9-4552-AE32-9319C03E41C0} = {AA9C3A4D-4CD6-46BE-A266-A5FE7BE52F65}
                {5DADCF29-6A44-4AD1-8E42-DCB162A1907D} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
                {E4EF583F-653D-4445-A649-555C8AD730E7} = {BB290B2D-F5B9-4552-AE32-9319C03E41C0}
+               {9738877F-0B01-4C37-855E-7465C5AB7B56} = {14FC5F77-041C-49BF-B28F-F976EC6F253C}
        EndGlobalSection
        GlobalSection(ExtensibilityGlobals) = postSolution
                SolutionGuid = {CC2E4F75-FADC-4F44-BD62-47A321828081}
index 85648d1..c467126 100644 (file)
                <get/>
                <put/>
        </property>
+       <method name="ExecFilterCommand"/>
        <method name="MakeUpper"/>
        <method name="MakeLower"/>
        <method name="RemoveDuplicates"/>
        <method name="CountDuplicates"/>
        <method name="SortAscending"/>
        <method name="SortDescending"/>
-       <method name="ExecFilterCommand"/>
-       <method name="Tokenize"/>
-       <method name="Trim"/>
+       <method name="ReverseColumns"/>
+       <method name="ReverseLines"/>
        <method name="SelectColumns"/>
        <method name="SelectLines"/>
+       <method name="Replace" internalName="ReplaceText"/>
+       <method name="Tokenize"/>
+       <method name="Trim"/>
 </implements>
 
 <script language="VBS">
@@ -72,19 +75,31 @@ Function get_PluginExtendedProperties()
        "SortDescending.MenuCaption=Sort Lines Descending;" & _
        "SortDescending.Description=Sort lines descending;" & _
        "ExecFilterCommand.MenuCaption=Apply Filter Command...;" & _
-       "ExecFilterCommand.Description=Apply filter command. " & vbCrLf & "Arguments: filter command. %1 is replaced with the file name.;" & _
+       "ExecFilterCommand.Description=Apply filter command. " & vbCrLf & _
+               "Arguments: filter command. %1 is replaced with the file name.;" & _
        "ExecFilterCommand.ArgumentsRequired;" & _
        "Tokenize.MenuCaption=Tokenize...;" & _
-       "Tokenize.Description=Tokenize selection. " & vbCrLf & "Arguments: a regular expression for tokenizing. (e.g. [^\w]+);" & _
+       "Tokenize.Description=Tokenize selection. " & vbCrLf & _
+               "Arguments: a regular expression for tokenizing. (e.g. [^\w]+);" & _
        "Tokenize.ArgumentsRequired;" & _
        "Trim.MenuCaption=Trim Spaces;" & _
        "Trim.Description=Trim spaces;" & _
        "SelectColumns.MenuCaption=Select Columns...;" & _
-       "SelectColumns.Description=Select some columns." & vbCrLf & "Arguments: list of column ranges to select. (e.g. -3,5-10,30-);" & _
+       "SelectColumns.Description=Select some columns." & vbCrLf & _
+               "Arguments: list of column ranges to select. (e.g. -3,5-10,30-) or regular expression;" & _
        "SelectColumns.ArgumentsRequired;" & _
        "SelectLines.MenuCaption=Select Lines...;" & _
-       "SelectLines.Description=Select some lines." & vbCrLf & "Arguments: list of line ranges to select. (e.g. -3,5-10,30-);" & _
-       "SelectLines.ArgumentsRequired;"
+       "SelectLines.Description=Select some lines." & vbCrLf & _
+               "Arguments: list of line ranges to select. (e.g. -3,5-10,30-) or regular expression;" & _
+       "SelectLines.ArgumentsRequired;" & _
+       "ReverseColumns.MenuCaption=Reverse Columns;" & _
+       "ReverseColumns.Description=Reverse columns;" & _
+       "ReverseLines.MenuCaption=Reverse Lines;" & _
+       "ReverseLines.Description=Reverse lines;" & _
+       "Replace.MenuCaption=Replace...;" & _
+       "Replace.Description=Replace text with another text." & vbCrLf & _
+               "Arguments: search text and replacement text;" & _
+       "Replace.ArgumentsRequired;"
 End Function
 
 Function get_PluginArguments()
@@ -96,7 +111,7 @@ Sub put_PluginArguments(NewValue)
 End Sub
 
 Function get_PluginVariables()
-       get_PluginVariables = Join(ariables, Chr(0))
+       get_PluginVariables = Join(variables, Chr(0))
 End Function
 
 Sub put_PluginVariables(NewValue)
@@ -116,16 +131,7 @@ Function IsLangJapanese()
        IsLangJapanese = (languageId = 1041)
 End Function
 
-' transformation functions
-Function MakeUpper(Text)
-       MakeUpper = UCase(Text)
-End Function
-
-Function MakeLower(Text)
-       MakeLower = LCase(Text)
-End Function
-
-Function ReplaceVariables(ByVal str)
+Function ReplaceVariables(str)
        Dim newstr
        Dim pos
        Dim foundpos
@@ -160,6 +166,196 @@ Function IsFirstArgumentEmpty()
        IsFirstArgumentEmpty = (Trim(arguments) = "")
 End Function
 
+Function SafeUBound(ary)
+       SafeUBound = -1
+       On Error Resume Next
+       SafeUBound = UBound(ary)
+End Function
+
+Function ParseArguments(args)
+       Dim ary()
+       Dim ch
+       Dim inQuotes
+       Dim token
+       Dim argsLen
+       Dim i, j
+       argsLen = Len(args)
+       For i = 1 To argsLen
+               ch = Mid(args, i, 1)
+               If Not inQuotes Then
+                       If ch = " " Or ch = vbTab Then
+                               If len(token) > 0 Then
+                                       ReDim Preserve ary(j)
+                                       ary(j) = token
+                                       j = j + 1
+                                       token = ""
+                               End If
+                       ElseIf ch = """" Then
+                               inQuotes = True
+                       Else
+                               token = token & ch
+                       End If
+               Else
+                       If ch = """" Then
+                               If i + 1 <= argsLen Then
+                                       If Mid(args, i + 1, 1) = """" Then
+                                               token = token & ch
+                                       End if
+                               End If
+                               inQuotes = False 
+                       Else
+                               token = token & ch
+                       End If
+               End If
+       Next
+       If Len(token) > 0 Then
+               ReDim Preserve ary(j)
+               ary(j) = token
+               j = j + 1
+               token = ""
+       End If
+       ParseArguments = ary 
+End Function
+
+Function ParseRanges(rangeText)
+       Dim i, j
+       Dim ary, ary2, aryRanges()
+       Dim rangeFrom, rangeTo
+       ary = Split(rangeText, ",")
+       j = 0
+       For i = 0 To SafeUBound(ary)
+               ary2 = Split(ary(i), "-")
+               rangeFrom = ""
+               If SafeUBound(ary2) >= 0 Then
+                       rangeFrom = Trim(ary2(0))
+               End If
+               rangeTo = rangeFrom
+               If SafeUBound(ary2) > 0 Then
+                       rangeTo = Trim(ary2(1))
+               End If
+               If IsNumeric(rangeFrom) Or IsNumeric(rangeTo) Then
+                       If Not IsNumeric(rangeFrom) Then rangeFrom = 1
+                       If Not IsNumeric(rangeTo)   Then rangeTo   = 1000000000
+                       If CDbl(rangeFrom) < 1 Or CDbl(rangeFrom) > 1000000000 Then rangeFrom = 1
+                       If CDbl(rangeTo)   < 1 Or CDbl(rangeTo)   > 1000000000 Then rangeTo   = 1
+                       If CDbl(rangeFrom) > CDbl(rangeTo) Then rangeTo = rangeFrom
+                       Redim preserve aryRanges(j)
+                       aryRanges(j) = Array(CLng(rangeFrom), CLng(rangeTo))
+                       j = j + 1
+               End If
+       Next
+       ParseRanges = aryRanges
+End Function
+
+Function ParseSelectColumnsLinesArguments(args, invert)
+       Dim rangesOrRegExps()
+       Dim argAry
+       Dim i, j
+       Dim re
+       Dim isOption
+       Set re = Nothing
+       argAry = ParseArguments(args)
+       invert = False
+       For i = 0 To SafeUBound(argAry)
+               isOption = False
+               If Len(argAry(i)) >= 2 Then
+                       Select Case Left(argAry(i), 1)
+                       Case "-", "/"
+                               Select Case Mid(argAry(i), 2, 1)
+                               Case "e", "i", "g"
+                                       isOption = True
+                                       If re Is Nothing Then
+                                               Set re = New RegExp
+                                               Redim Preserve rangesOrRegExps(j)
+                                               Set rangesOrRegExps(j) = re
+                                               j = j + 1
+                                       End If
+                                       If InStr(argAry(i), "i") > 0 Then
+                                               re.IgnoreCase = True
+                                       End If
+                                       If InStr(argAry(i), "g") > 0 Then
+                                               re.Global  = True
+                                       End If
+                               Case "v"
+                                       isOption = True
+                                       invert = True
+                               End Select
+                       End Select
+               End If
+               If Not isOption Then
+                       If Not (re Is Nothing) Then
+                               re.Pattern = argAry(i)
+                               Set re = Nothing
+                       Else
+                               Redim Preserve rangesOrRegExps(j)
+                               rangesOrRegExps(j) = ParseRanges(argAry(i))
+                               If SafeUBound(rangesOrRegExps(j)) < 0 Then
+                                       Set rangesOrRegExps(j) = New RegExp
+                                       rangesOrRegExps(j).Pattern = argAry(i)
+                               End If
+                               j = j + 1
+                       End If
+               End If
+       Next
+       ParseSelectColumnsLinesArguments = rangesOrRegExps
+End Function
+
+Function ParseReplaceArguments(args, regex, ignoreCase)
+       Dim patterns()
+       Dim argAry
+       Dim i, j
+       Dim re
+       Dim isOption
+       Set re = Nothing
+       argAry = ParseArguments(args)
+       regex = False
+       ignoreCase = False
+       For i = 0 To SafeUBound(argAry)
+               isOption = False
+               If Len(argAry(i)) >= 2 Then
+                       Select Case Left(argAry(i), 1)
+                       Case "-", "/"
+                               Select Case Mid(argAry(i), 2, 1)
+                               Case "e", "i"
+                                       isOption = True
+                                       regex = True
+                                       If InStr(argAry(i), "i") > 0 Then
+                                               ignoreCase = True
+                                       End If
+                               End Select
+                       End Select
+               End If
+               If Not isOption Then
+                       Redim Preserve patterns(j)
+                       patterns(j) = argAry(i)
+                       j = j + 1
+               End If
+       Next
+       ParseReplaceArguments = patterns
+End Function
+
+Function SplitLines(text, eol)
+       Dim re, matches
+       Set re = New RegExp
+       re.Global = False
+       re.IgnoreCase = False
+       re.Pattern = "\r\n|\n|\r"
+       Set matches = re.Execute(text)
+       If matches.Count > 0 Then
+               eol = matches(0).Value
+       End If
+       SplitLines = Split(text, eol)
+End Function
+
+' transformation functions
+Function MakeUpper(Text)
+       MakeUpper = UCase(Text)
+End Function
+
+Function MakeLower(Text)
+       MakeLower = LCase(Text)
+End Function
+
 Function ExecFilterCommand(Text)
        Dim cmd
        If IsFirstArgumentEmpty() Then
@@ -201,7 +397,7 @@ Function ExecFilterCommand(Text)
        ts.Close
 
        Dim exe
-       Set exe = wsh.Exec("cmd /c type """ & path & """  | " & cmd & " 2>&1")
+       Set exe = wsh.Exec("cmd /c type """ & path & """ | " & cmd & " 2>&1")
        If exe Is Nothing Then
                If IsLangJapanese() Then
                        MsgBox "\83R\83}\83\93\83h " & cmd & " \82Ì\8eÀ\8ds\82É\8e¸\94s\82µ\82Ü\82µ\82½:" & Err.Description 
@@ -221,62 +417,27 @@ Function ExecFilterCommand(Text)
 
 End Function
 
-Function SafeUBound(ary)
-       SafeUBound = -1
-       On Error Resume Next
-       SafeUBound = UBound(ary)
-End Function
-
-Function ParseRanges(ByVal rangeText)
-       Dim i, j
-       Dim ary, ary2, aryRanges()
-       Dim rangeFrom, rangeTo
-       ary = Split(rangeText, ",")
-       j = 0
-       For i = 0 To SafeUBound(ary)
-               ary2 = Split(ary(i), "-")
-               rangeFrom = ""
-               If SafeUBound(ary2) >= 0 Then
-                       rangeFrom = Trim(ary2(0))
-               End If
-               rangeTo = rangeFrom
-               If SafeUBound(ary2) > 0 Then
-                       rangeTo = Trim(ary2(1))
-               End If
-               If IsNumeric(rangeFrom) Or IsNumeric(rangeTo) Then
-                       If Not IsNumeric(rangeFrom) Then rangeFrom = 1
-                       If Not IsNumeric(rangeTo)   Then rangeTo   = 1000000000
-                       If CDbl(rangeFrom) < 1 Or CDbl(rangeFrom) > 1000000000 Then rangeFrom = 1
-                       If CDbl(rangeTo)   < 1 Or CDbl(rangeTo)   > 1000000000 Then rangeTo   = 1
-                       If CDbl(rangeFrom) > CDbl(rangeTo) Then rangeTo = rangeFrom
-                       Redim preserve aryRanges(j)
-                       aryRanges(j) = Array(CLng(rangeFrom), CLng(rangeTo))
-                       j = j + 1
-               End If
-       Next
-       ParseRanges = aryRanges
-End Function
-
 Function SelectColumns(Text)
-       Dim rangesStr, ranges
-       Dim re
-       Dim matches
+       Dim args, ranges, regexpStr
+       Dim matches, m
        Dim lines, eol, line
-       Dim i, j
+       Dim i, j, k
+       Dim rangesOrRegExps
+       Dim invert
        If IsFirstArgumentEmpty() Then
-               rangesStr = regRead(PluginRegKeyPath & "SelectColumns", "")
+               args = regRead(PluginRegKeyPath & "SelectColumns", "")
                If IsLangJapanese() Then
-                       rangesStr = InputBox("\92\8a\8fo\82·\82é\97ñ\94Ô\8d\86\82Ü\82½\82Í\97ñ\94Ô\8d\86\82Ì\94Í\88Í\82ð1\82Â\82Ü\82½\82Í\83J\83\93\83}\8bæ\90Ø\82è\82Å\95¡\90\94\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢ (\97á: -3,5-10,30-):", "SelectColumns", ranges)
+                       args = InputBox("\92\8a\8fo\82·\82é\97ñ\94Ô\8d\86\82Ì\94Í\88Í\82Ü\82½\82Í\90³\8bK\95\\8c»\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢ (\97á: -3,5-10,30-)" & vbCrLf & "\82Ü\82½\82Í\92\8a\8fo\82µ\82½\82¢\95\8e\9a\97ñ\82É\83}\83b\83`\82·\82é\90³\8bK\95\\8c»\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢:", "SelectColumns", ranges)
                Else
-                       rangesStr = InputBox("Enter the list of column ranges to select (e.g. -3,5-10,30-):", "SelectColumns", rangesStr)
+                       args = InputBox("Enter the list of column ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectColumns", args)
                End If
-               If rangesStr <> "" Then
-                       wsh.RegWrite PluginRegKeyPath & "SelectColumns", rangesStr
+               If args <> "" Then
+                       wsh.RegWrite PluginRegKeyPath & "SelectColumns", args
                End If
        Else
-               rangesStr = arguments
+               args = arguments
        End If
-       If rangesStr = "" Then
+       If args = "" Then
                If IsLangJapanese() Then
                        Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
                Else
@@ -284,21 +445,26 @@ Function SelectColumns(Text)
                End If
                Exit Function
        End If
-       ranges = ParseRanges(rangesStr)
-       Set re = New RegExp
-       re.Global = False
-       re.IgnoreCase = False
-       re.Pattern = "\r\n|\n|\r"
-       Set matches = re.Execute(Text)
-       If matches.Count > 0 Then
-               eol = matches(0).Value
-       End If
-       lines = Split(Text, eol)
+       lines = SplitLines(Text, eol)
+       rangesOrRegExps = ParseSelectColumnsLinesArguments(args, invert)
        For i = 0 To SafeUBound(lines)
                line = ""
-               For j = 0 To SafeUBound(ranges) 
-                       If ranges(j)(0) <= Len(lines(i)) Then
-                               line = line & Mid(lines(i), ranges(j)(0), ranges(j)(1) - ranges(j)(0) + 1)
+               For j = 0 To SafeUBound(rangesOrRegExps)
+                       If IsArray(rangesOrRegExps(j)) Then
+                               For k = 0 To SafeUBound(rangesOrRegExps(j))
+                                       If rangesOrRegExps(j)(k)(0) <= Len(lines(i)) Then
+                                               line = line & Mid(lines(i), rangesOrRegExps(j)(k)(0), rangesOrRegExps(j)(k)(1) - rangesOrRegExps(j)(k)(0) + 1)
+                                       End If
+                               Next
+                       Else
+                               If Not invert Then
+                                       Set matches = rangesOrRegExps(j).Execute(lines(i))
+                                       For Each m In matches
+                                               line = line & m.Value
+                                       Next
+                               Else
+                                       line = line & rangesOrRegExps(j).Replace(lines(i), "")
+                               End If
                        End If
                Next
                lines(i) = line
@@ -307,25 +473,27 @@ Function SelectColumns(Text)
 End Function
 
 Function SelectLines(Text)
-       Dim rangesStr, ranges
-       Dim re
-       Dim matches
+       Dim args, ranges
+       Dim matches, rangesOrRegExps
        Dim lines, newlines(), eol
-       Dim i, j, k
+       Dim i, j, k, l
+       Dim max
+       Dim matched
+       Dim invert
        If IsFirstArgumentEmpty() Then
-               rangesStr = regRead(PluginRegKeyPath & "SelectLines", "")
+               args = regRead(PluginRegKeyPath & "SelectLines", "")
                If IsLangJapanese() Then
-                       rangesStr = InputBox("\92\8a\8fo\82·\82é\8ds\94Ô\8d\86\82Ü\82½\82Í\8ds\94Ô\8d\86\82Ì\94Í\88Í\82ð1\82Â\82Ü\82½\82Í\83J\83\93\83}\8bæ\90Ø\82è\82Å\95¡\90\94\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢ (\97á: -3,5-10,30-):", "SelectLines", ranges)
+                       args = InputBox("\92\8a\8fo\82·\82é\8ds\94Ô\8d\86\82Ì\94Í\88Í\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢ (\97á: -3,5-10,30-)" & vbCrLf & "\82Ü\82½\82Í\81A\92\8a\8fo\82µ\82½\82¢\8ds\82É\83}\83b\83`\82·\82é\90³\8bK\95\\8c»\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢:", "SelectLines", ranges)
                Else
-                       rangesStr = InputBox("Enter the list of line ranges to select (e.g. -3,5-10,30-):", "SelectLines", rangesStr)
+                       args = InputBox("Enter the list of line ranges to select (e.g. -3,5-10,30-)" & vbCrLf & "or regular expression:", "SelectLines", args)
                End If
-               If rangesStr <> "" Then
-                       wsh.RegWrite PluginRegKeyPath & "SelectLines", rangesStr
+               If args <> "" Then
+                       wsh.RegWrite PluginRegKeyPath & "SelectLines", args
                End If
        Else
-               rangesStr = arguments
+               args = arguments
        End If
-       If rangesStr = "" Then
+       If args = "" Then
                If IsLangJapanese() Then
                        Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
                Else
@@ -333,36 +501,100 @@ Function SelectLines(Text)
                End If
                Exit Function
        End If
-       ranges = ParseRanges(rangesStr)
-       Set re = New RegExp
-       re.Global = False
-       re.IgnoreCase = False
-       re.Pattern = "\r\n|\n|\r"
-       Set matches = re.Execute(Text)
-       If matches.Count > 0 Then
-               eol = matches(0).Value
-       End If
-       lines = Split(Text, eol)
-       k = 0
-       For i = 0 To SafeUBound(ranges) 
-               For j = ranges(i)(0) - 1 To ranges(i)(1) - 1
-                       If j < SafeUBound(lines) Then
-                               ReDim Preserve newlines(k)
-                               newlines(k) = lines(j)
-                               k = k + 1
-                       End If
-               Next
+       lines = SplitLines(Text, eol)
+       l = 0
+       rangesOrRegExps = ParseSelectColumnsLinesArguments(args, invert)
+       For i = 0 To SafeUBound(rangesOrRegExps)
+               If IsArray(rangesOrRegExps(i)) Then
+                       For j = 0 To SafeUBound(rangesOrRegExps(i))
+                               max =rangesOrRegExps(i)(j)(1) - 1 
+                               If max > SafeUBound(lines) Then max = SafeUBound(lines)
+                               For k = rangesOrRegExps(i)(j)(0) - 1 To max
+                                       If k <= SafeUBound(lines) Then
+                                               ReDim Preserve newlines(l)
+                                               newlines(l) = lines(k)
+                                               l = l + 1
+                                       End If
+                               Next
+                       Next
+               Else
+                       For j = 0 To SafeUBound(lines)
+                               matched = rangesOrRegExps(i).Test(lines(j))
+                               If invert Then matched = Not matched
+                               If matched Then
+                                       ReDim Preserve newlines(l)
+                                       newlines(l) = lines(j)
+                                       l = l + 1
+                               End If
+                       Next
+               End If
        Next
        If SafeUBound(lines) >= 0 Then
-               If lines(SafeUBound(lines)) = "" Then
-                       ReDim Preserve newlines(k)
-                       newlines(k) = ""
-                       k = k + 1
+               If lines(UBound(lines)) = "" Then
+                       If SafeUBound(newlines) >= 0 Then
+                               If newlines(UBound(newlines)) <> "" Then
+                                       ReDim Preserve newlines(l)
+                                       newlines(l) = ""
+                                       l = l + 1
+                               End If
+                       End If
                End If
        End If
        SelectLines = Join(newlines, eol)
 End Function
 
+Function ReplaceText(Text)
+       Dim args, patterns
+       Dim i
+       Dim re, regex
+       Dim ignoreCase
+       ReplaceText = Text
+       If IsFirstArgumentEmpty() Then
+               args = regRead(PluginRegKeyPath & "Replace", "")
+               If IsLangJapanese() Then
+                       args = InputBox("\8c\9f\8dõ\82·\82é\95\8e\9a\97ñ\82Æ\92u\8a·\82·\82é\95\8e\9a\97ñ\82ð\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢:", "Replace", ranges)
+               Else
+                       args = InputBox("Enter the search text and replacement text:", "Replace", args)
+               End If
+               If args <> "" Then
+                       wsh.RegWrite PluginRegKeyPath & "Replace", args
+               End If
+       Else
+               args = arguments
+       End If
+       If args = "" Then
+               If IsLangJapanese() Then
+                       Err.Raise 30001, , "\83L\83\83\83\93\83Z\83\8b\82³\82ê\82Ü\82µ\82½"
+               Else
+                       Err.Raise 30001, , "Canceled"
+               End If
+               Exit Function
+       End If
+       patterns = ParseReplaceArguments(args, regex, ignoreCase)
+       If regex Then
+               For i = 0 To SafeUBound(patterns) Step 2
+                       Set re = New RegExp
+                       re.IgnoreCase = ignoreCase
+                       re.Global = True
+                       re.Multiline = True
+                       re.Pattern = patterns(i)
+                       If i + 1 <= UBound(patterns) Then
+                               ReplaceText = re.Replace(ReplaceText, patterns(i + 1))
+                       Else
+                               ReplaceText = re.Replace(ReplaceText, "")
+                       End If
+               Next
+       Else
+               For i = 0 To SafeUBound(patterns) Step 2
+                       If i + 1 <= UBound(patterns) Then
+                               ReplaceText = Replace(ReplaceText, patterns(i), patterns(i + 1))
+                       Else
+                               ReplaceText = Replace(ReplaceText, patterns(i), "")
+                       End If
+               Next
+       End If
+End Function
+
 ' port from WinMerge2011
 Function Tokenize(Text)
        Dim pattern
@@ -419,7 +651,7 @@ function RemoveDuplicates(Text) {
                }
        }
        if (lasteol)
-               newlines[j] = "";
+               newlines.push("");
        return newlines.join(eol);
 }
 
@@ -448,10 +680,50 @@ function CountDuplicates(Text) {
                newlines[j] = line + '\t' + dic[line];
                j++;
        }
-       newlines[j] = "";
+       if (eol)
+               newlines[j] = "";
        return newlines.join(eol);
 }
 
+function ReverseColumns(Text) {
+       var eol = Text.match(/\r\n|\n|\r/);
+       var lines = Text.split(eol);
+       var lasteol = false;
+       if (!lines[lines.length - 1]) {
+               lines.pop();
+               lasteol = true;
+       }
+       for (var i = 0; i < lines.length; i++) {
+               var line = lines[i];
+               var newline = "";
+               for (var j = 0; j < line.length; j++)
+                       newline += line.substr(line.length - j - 1, 1);
+               lines[i] = newline;
+       }
+       if (lasteol)
+               lines.push("");
+       return lines.join(eol);
+}
+
+function ReverseLines(Text) {
+       var eol = Text.match(/\r\n|\n|\r/);
+       var lines = Text.split(eol);
+       var lasteol = false;
+       if (!lines[lines.length - 1]) {
+               lines.pop();
+               lasteol = true;
+       }
+       var m = parseInt(lines.length / 2);
+       for (var i = 0; i < m; i++) {
+               var line = lines[i];
+               lines[i] = lines[lines.length - i - 1]
+               lines[lines.length - i - 1] = line;
+       }
+       if (lasteol)
+               lines.push("");
+       return lines.join(eol);
+}
+
 function SortAscending(Text) {
        var eol = Text.match(/\r\n|\n|\r/);
        var lines = Text.split(eol);
index 1255c70..a215ac2 100644 (file)
@@ -3701,25 +3701,28 @@ BEGIN
     IDS_PLUGIN_MENU_CAPTION4  "Count Duplicate Lines"\r
     IDS_PLUGIN_MENU_CAPTION5  "Sort Lines Ascending"\r
     IDS_PLUGIN_MENU_CAPTION6  "Sort Lines Descending"\r
-    IDS_PLUGIN_MENU_CAPTION7  "Apply Filter Command..."\r
-    IDS_PLUGIN_MENU_CAPTION8  "Tokenize..."\r
-    IDS_PLUGIN_MENU_CAPTION9  "Trim Spaces"\r
-    IDS_PLUGIN_MENU_CAPTION10 "Select Columns..."\r
-    IDS_PLUGIN_MENU_CAPTION11 "Select Lines..."\r
-    IDS_PLUGIN_MENU_CAPTION12 "Insert Date"\r
-    IDS_PLUGIN_MENU_CAPTION13 "Insert Time"\r
-    IDS_PLUGIN_MENU_CAPTION14 "Apply Patch..."\r
-    IDS_PLUGIN_MENU_CAPTION15 "Ignore Columns"\r
-    IDS_PLUGIN_MENU_CAPTION16 "Ignore Comments (C-Family Languages)"\r
-    IDS_PLUGIN_MENU_CAPTION17 "Ignore CSV Fields"\r
-    IDS_PLUGIN_MENU_CAPTION18 "Ignore TSV Fields"\r
-    IDS_PLUGIN_MENU_CAPTION19 "Apply Prediff Substitution Filters"\r
-    IDS_PLUGIN_MENU_CAPTION20 "Prettify JSON"\r
-    IDS_PLUGIN_MENU_CAPTION21 "Prettify XML"\r
-    IDS_PLUGIN_MENU_CAPTION22 "Visualize Graphviz"\r
-    IDS_PLUGIN_MENU_CAPTION23 "Query CSV Data..."\r
-    IDS_PLUGIN_MENU_CAPTION24 "Query TSV Data..."\r
-    IDS_PLUGIN_MENU_CAPTION25 "Query JSON Data..."\r
+    IDS_PLUGIN_MENU_CAPTION7  "Reverse Columns"\r
+    IDS_PLUGIN_MENU_CAPTION8  "Reverse Lines"\r
+    IDS_PLUGIN_MENU_CAPTION9  "Replace..."\r
+    IDS_PLUGIN_MENU_CAPTION10 "Apply Filter Command..."\r
+    IDS_PLUGIN_MENU_CAPTION11 "Tokenize..."\r
+    IDS_PLUGIN_MENU_CAPTION12 "Trim Spaces"\r
+    IDS_PLUGIN_MENU_CAPTION13 "Select Columns..."\r
+    IDS_PLUGIN_MENU_CAPTION14 "Select Lines..."\r
+    IDS_PLUGIN_MENU_CAPTION15 "Insert Date"\r
+    IDS_PLUGIN_MENU_CAPTION16 "Insert Time"\r
+    IDS_PLUGIN_MENU_CAPTION17 "Apply Patch..."\r
+    IDS_PLUGIN_MENU_CAPTION18 "Ignore Columns"\r
+    IDS_PLUGIN_MENU_CAPTION19 "Ignore Comments (C-Family Languages)"\r
+    IDS_PLUGIN_MENU_CAPTION20 "Ignore CSV Fields"\r
+    IDS_PLUGIN_MENU_CAPTION21 "Ignore TSV Fields"\r
+    IDS_PLUGIN_MENU_CAPTION22 "Apply Prediff Substitution Filters"\r
+    IDS_PLUGIN_MENU_CAPTION23 "Prettify JSON"\r
+    IDS_PLUGIN_MENU_CAPTION24 "Prettify XML"\r
+    IDS_PLUGIN_MENU_CAPTION25 "Visualize Graphviz"\r
+    IDS_PLUGIN_MENU_CAPTION26 "Query CSV Data..."\r
+    IDS_PLUGIN_MENU_CAPTION27 "Query TSV Data..."\r
+    IDS_PLUGIN_MENU_CAPTION28 "Query JSON Data..."\r
     IDS_PLUGIN_MISSING_PLUGIN_NAME "Missing plugin name in plugin pipeline: %1"\r
     IDS_PLUGIN_MISSING_QUOTATION_MARK"Missing quotation mark in plugin pipeline: %1"\r
     IDS_PLUGIN_TITLE1        "Specify plugin arguments"\r
index 5153b79..51f452a 100644 (file)
@@ -2,13 +2,32 @@ Option Explicit
 
 Dim FileSys
 Dim ScriptFolder
+Dim g_cnt
+Dim g_testname
 
 Set FileSys = CreateObject("Scripting.FileSystemObject")
 ScriptFolder = FileSys.getParentFolderName(WScript.ScriptFullName)
 
-Sub AssertTrue(ByVal value, ByVal msg)
+Sub SetTestName(testname)
+    g_cnt = 0
+    g_testname = testname
+End Sub
+
+Function GetCurrentTestName()
+    GetCurrentTestName = g_testname & g_cnt
+End Function
+
+Sub AssertTrue(value)
+    g_cnt = g_cnt + 1
     If Not value Then
-        Err.Raise 30001, , msg
+        Err.Raise 30001, , GetCurrentTestName()
+    End If
+End Sub
+
+Sub AssertEquals(expected, actual)
+    g_cnt = g_cnt + 1
+    If expected <> actual Then
+           Err.Raise 30001, , GetCurrentTestName() & vbCrLf & "expected: """ & expected & """" & vbCrLf & "actual: """ & actual & """"
     End If
 End Sub
 
@@ -31,20 +50,195 @@ End Sub
 
 Sub EditorAddinTest
     Dim p
+    Dim i
+    Dim asciiChars
+    Dim chars
     Set p = GetObject("script: " & ScriptFolder & "\..\..\Plugins\dlls\editor addin.sct")
 
+    For i = 0 To 127
+        asciiChars = asciiChars & Chr(i)
+    Next
+
+    ' MakeUpper
+    SetTestName "MakeUpper"
+    AssertEquals "", p.MakeUpper("")
+    AssertEquals " ~0129ABCZABCZ", p.MakeUpper(" ~0129abczABCZ")
+    AssertEquals Replace(asciiChars, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), p.MakeUpper(asciiChars)
+
+    ' MakeLower
+    SetTestName "MakeLower"
+    AssertEquals "", p.MakeLower("")
+    AssertEquals " ~0129abczabcz", p.MakeLower(" ~0129abczABCZ")
+    AssertEquals Replace(asciiChars, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"), p.MakeLower(asciiChars)
+
+    ' ExecFilterCommand
+    SetTestName "ExecFilterCommand"
+    p.PluginArguments = "sort"
+    AssertEquals "1" & vbCrLf & "2" & vbCrLf, p.ExecFilterCommand("2" & vbCrLf & "1" & vbCrLf)
+    p.PluginArguments = "echo a"
+    AssertEquals "a " & vbCrLf, p.ExecFilterCommand("")
+
+    ' SelectColumns
+    SetTestName "SelectColumns"
+    p.PluginArguments = "1"
+    AssertEquals "a", p.SelectColumns("abc")
+    AssertEquals "a" & vbCrLf & "d", p.SelectColumns("abc" & vbCrLf & "def")
+    AssertEquals "a" & vbCrLf & "d" & vbCrLf, p.SelectColumns("abc" & vbCrLf & "def" & vbCrLf)
+    p.PluginArguments = "3"
+    AssertEquals "c" & vbCrLf & "f", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "1,3"
+    AssertEquals "ac" & vbCrLf & "d", p.SelectColumns("abc" & vbCrLf & "de")
+    p.PluginArguments = "1-3"
+    AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "-3"
+    AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "1-"
+    AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "2-"
+    AssertEquals "bc" & vbCrLf & "ef", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "3-"
+    AssertEquals "c" & vbCrLf & "f", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "4-"
+    AssertEquals "" & vbCrLf & "", p.SelectColumns("abc" & vbCrLf & "def")
+
+    p.PluginArguments = "-e ab"
+    AssertEquals "", p.SelectColumns("")
+    AssertEquals "ab" & vbCrLf & "", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "-e ""ab|de"""
+    AssertEquals "ab" & vbCrLf & "de", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "-e ^."
+    AssertEquals "a" & vbCrLf & "d", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "-e .*"
+    AssertEquals "abc" & vbCrLf & "def", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "-e -i ""Ab|dE"""
+    AssertEquals "ab" & vbCrLf & "de", p.SelectColumns("abc" & vbCrLf & "def")
+    p.PluginArguments = "-v -e ""ab|de"""
+    AssertEquals "c" & vbCrLf & "f", p.SelectColumns("abc" & vbCrLf & "def")
+
+    p.PluginArguments = "1-3 -e ab 2-3"
+    AssertEquals "abcabbc" & vbCrLf & "defef", p.SelectColumns("abc" & vbCrLf & "def")
+
+    ' SelectLines
+    SetTestName "SelectLines"
+    p.PluginArguments = "1"
+    AssertEquals "", p.SelectLines("")
+    AssertEquals "aaa", p.SelectLines("aaa")
+    p.PluginArguments = "2"
+    AssertEquals "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    p.PluginArguments = "1,2"
+    AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    p.PluginArguments = "1-2"
+    AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "1-"
+    AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    AssertEquals "aaa" & vbCrLf & vbCrLf & vbCrLf, p.SelectLines("aaa" & vbCrLf & vbCrLf & vbCrLf)
+    p.PluginArguments = "-2"
+    AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "4-5"
+    AssertEquals "", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "", p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+
+    p.PluginArguments = "-e aa"
+    AssertEquals "", p.SelectLines("")
+    AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "-e -i AA"
+    AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "-e .*"
+    AssertEquals "aaa" & vbCrLf & "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "^a"
+    AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "a$"
+    AssertEquals "aaa", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+    p.PluginArguments = "-v a$"
+    AssertEquals "bbb", p.SelectLines("aaa" & vbCrLf & "bbb")
+    AssertEquals "bbb" & vbCrLf, p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf)
+
+    p.PluginArguments = "1 -e c$"
+    AssertEquals "aaa" & vbCrLf & "ccc", p.SelectLines("aaa" & vbCrLf & "bbb" & vbCrLf & "ccc")
+
+    ' Replace
+    SetTestName "Replace"
+    p.PluginArguments = "abc def"
+    AssertEquals "", p.Replace("")
+    AssertEquals "def def def def", p.Replace("abc def abc def")
+    p.PluginArguments = "-e a.c XXX"
+    AssertEquals "", p.Replace("")
+    AssertEquals "XXX def XXX def", p.Replace("abc def abc def")
+    p.PluginArguments = "-e -i A.C XXX"
+    AssertEquals "XXX def XXX def", p.Replace("abc def abc def")
+    p.PluginArguments = "-e ^\d+ XXX"
+    AssertEquals "XXX abc" & vbCrLf & "XXX def", p.Replace("1000 abc" & vbCrLf & "1001 def")
+
+    ' ReverseColumns
+    SetTestName "ReverseColumns"
+    AssertEquals "", p.ReverseColumns("")
+    AssertEquals "a", p.ReverseColumns("a")
+    AssertEquals "a" & vbCrLf & "b", p.ReverseColumns("a" & vbCrLf & "b")
+    AssertEquals "ba", p.ReverseColumns("ab")
+    AssertEquals "ba" & vbCrLf & "dc", p.ReverseColumns("ab" & vbCrLf & "cd")
+    AssertEquals "cba", p.ReverseColumns("abc")
+    AssertEquals "cba" & vbCrLf & "fed", p.ReverseColumns("abc" & vbCrLf & "def")
+    AssertEquals "dcba", p.ReverseColumns("abcd")
+    AssertEquals "dcba" & vbCrLf & "hgfe", p.ReverseColumns("abcd" & vbCrLf & "efgh")
+
+    ' ReverseLines
+    SetTestName "ReverseLines"
+    AssertEquals "", p.ReverseLines("")
+    AssertEquals "a", p.ReverseLines("a")
+    AssertEquals "a" & vbCrLf, p.ReverseLines("a" & vbCrLf)
+    AssertEquals "b" & vbCrLf & "a", p.ReverseLines("a" & vbCrLf & "b")
+    AssertEquals "b" & vbCrLf & "a" & vbCrLf, p.ReverseLines("a" & vbCrLf & "b" & vbCrLf)
+    AssertEquals "c" & vbCrLf & "b" & vbCrLf & "a", p.ReverseLines("a" & vbCrLf & "b" & vbCrLf & "c")
+    AssertEquals "c" & vbCrLf & "b" & vbCrLf & "a" & vbCrLf, p.ReverseLines("a" & vbCrLf & "b" & vbCrLf & "c" & vbCrLf)
+    AssertEquals "d" & vbCrLf & "c" & vbCrLf & "b" & vbCrLf & "a", p.ReverseLines("a" & vbCrLf & "b" & vbCrLf & "c" & vbCrLf & "d")
+
+    ' Tokenize
+    SetTestName "Tokenize"
+    p.PluginArguments = "[^\w]+"
+    AssertEquals "", p.Tokenize("")
+    AssertEquals "aaa", p.Tokenize("aaa")
+    AssertEquals "aaa" & vbCrLf & "abcd", p.Tokenize("aaa abcd")
+
+    ' RemoveDuplicates
+    SetTestName "RemoveDuplicates"
+    AssertEquals "", p.RemoveDuplicates("")
+    AssertEquals "aaa", p.RemoveDuplicates("aaa")
+    AssertEquals "aaa", p.RemoveDuplicates("aaa" & vbCrLf & "aaa")
+    AssertEquals "aaa" & vbCrLf, p.RemoveDuplicates("aaa" & vbCrLf & "aaa" & vbCrLf)
+    AssertEquals "aaa" & vbCrLf & "bbb", p.RemoveDuplicates("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.RemoveDuplicates("aaa" & vbCrLf & "bbb" & vbCrLf)
+
+    ' CountDuplicates
+    SetTestName "CountDuplicates"
+    AssertEquals "", p.CountDuplicates("")
+    AssertEquals "aaa" & vbTab & "1", p.CountDuplicates("aaa")
+    AssertEquals "aaa" & vbTab & "2" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "aaa")
+    AssertEquals "aaa" & vbTab & "2" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "aaa" & vbCrLf)
+    AssertEquals "aaa" & vbTab & "1" & vbCrLf & "bbb" & vbTab & "1" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "bbb")
+    AssertEquals "aaa" & vbTab & "1" & vbCrLf & "bbb" & vbTab & "1" & vbCrLf, p.CountDuplicates("aaa" & vbCrLf & "bbb" & vbCrLf)
+
     ' Trim
-    AssertTrue ("aaa" = p.Trim("aaa")), "Trim1"
-    AssertTrue ("aaa" = p.Trim(" aaa")), "Trim2"
-    AssertTrue ("aaa" = p.Trim("aaa  ")), "Trim3"
-    AssertTrue ("aaa" = p.Trim("  aaa  ")), "Trim4"
-    AssertTrue ("aaa" = p.Trim(vbTab & "  aaa  " & vbTab)), "Trim5"
-    AssertTrue ("aaa" & vbCrLf & "bbb" = p.Trim(" aaa  " & vbCrLf & "  bbb ")), "Trim6"
-    AssertTrue ("aaa" & vbCrLf & "bbb" & vbCrLf = p.Trim(" aaa  " & vbCrLf & "  bbb " & vbCrLf)), "Trim7"
+    SetTestName "Trim"
+    AssertEquals "", p.Trim("")
+    AssertEquals "", p.Trim(" ")
+    AssertEquals "aaa", p.Trim("aaa")
+    AssertEquals "aaa", p.Trim(" aaa")
+    AssertEquals "aaa", p.Trim("aaa  ")
+    AssertEquals "aaa", p.Trim("  aaa  ")
+    AssertEquals "aaa", p.Trim(vbTab & "  aaa  " & vbTab)
+    AssertEquals "aaa" & vbCrLf & "bbb", p.Trim(" aaa  " & vbCrLf & "  bbb ")
+    AssertEquals "aaa" & vbCrLf & "bbb" & vbCrLf, p.Trim(" aaa  " & vbCrLf & "  bbb " & vbCrLf)
+
 End Sub
 
 EditorAddinTest
-
 'CompareMSExcelFilesTest
 
-
index 7b3998b..75290f0 100644 (file)
@@ -37,7 +37,7 @@
 </head>
 <body>
 <h1>Translations Status</h1>
-<p>Status from <strong>2021-06-24</strong>:</p>
+<p>Status from <strong>2021-06-26</strong>:</p>
 <h2>WinMerge</h2>
 <table class="status">
   <tr>
   </tr>
   <tr>
     <td class="left">Arabic</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">908</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">163</td>
+    <td class="right untranslated">166</td>
     <td class="right">85 %</td>
     <td class="center">2019-12-30</td>
   </tr>
   <tr>
     <td class="left">Basque</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">644</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">427</td>
+    <td class="right untranslated">430</td>
     <td class="right">60 %</td>
     <td class="center">2013-02-03</td>
   </tr>
   <tr>
     <td class="left">Brazilian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1024</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">47</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">50</td>
+    <td class="right">95 %</td>
     <td class="center">2021-02-14</td>
   </tr>
   <tr>
     <td class="left">Bulgarian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">951</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">120</td>
+    <td class="right untranslated">123</td>
     <td class="right">89 %</td>
     <td class="center">2021-02-11</td>
   </tr>
   <tr>
     <td class="left">Catalan</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">570</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">501</td>
+    <td class="right untranslated">504</td>
     <td class="right">53 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">ChineseSimplified</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">981</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">90</td>
-    <td class="right">92 %</td>
+    <td class="right untranslated">93</td>
+    <td class="right">91 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">ChineseTraditional</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">861</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">210</td>
+    <td class="right untranslated">213</td>
     <td class="right">80 %</td>
     <td class="center">2010-02-19</td>
   </tr>
   <tr>
     <td class="left">Croatian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">635</td>
     <td class="right fuzzy">1</td>
-    <td class="right untranslated">435</td>
+    <td class="right untranslated">438</td>
     <td class="right">59 %</td>
     <td class="center">2009-02-13</td>
   </tr>
   <tr>
     <td class="left">Czech</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">610</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">461</td>
+    <td class="right untranslated">464</td>
     <td class="right">57 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Danish</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">644</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">427</td>
+    <td class="right untranslated">430</td>
     <td class="right">60 %</td>
     <td class="center">2013-01-13</td>
   </tr>
   <tr>
     <td class="left">Dutch</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1070</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">1</td>
+    <td class="right untranslated">4</td>
     <td class="right">100 %</td>
     <td class="center">2018-09-06</td>
   </tr>
   <tr>
     <td class="left">English</td>
-    <td class="right">1072</td>
-    <td class="right translated">1072</td>
+    <td class="right">1075</td>
+    <td class="right translated">1075</td>
     <td class="right fuzzy">0</td>
     <td class="right untranslated">0</td>
     <td class="right">100 %</td>
-    <td class="center">2021-06-24</td>
+    <td class="center">2021-06-26</td>
   </tr>
   <tr>
     <td class="left">Finnish</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">908</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">163</td>
+    <td class="right untranslated">166</td>
     <td class="right">85 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">French</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1025</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">46</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">49</td>
+    <td class="right">95 %</td>
     <td class="center">2021-04-29</td>
   </tr>
   <tr>
     <td class="left">Galician</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1025</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">46</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">49</td>
+    <td class="right">95 %</td>
     <td class="center">2021-04-18</td>
   </tr>
   <tr>
     <td class="left">German</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1025</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">46</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">49</td>
+    <td class="right">95 %</td>
     <td class="center">2021-04-24</td>
   </tr>
   <tr>
     <td class="left">Greek</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">608</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">463</td>
+    <td class="right untranslated">466</td>
     <td class="right">57 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Hungarian</td>
-    <td class="right">1071</td>
-    <td class="right translated">1022</td>
+    <td class="right">1074</td>
+    <td class="right translated">1055</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">49</td>
-    <td class="right">95 %</td>
+    <td class="right untranslated">19</td>
+    <td class="right">98 %</td>
     <td class="center">2021-03-15</td>
   </tr>
   <tr>
     <td class="left">Italian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">911</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">160</td>
+    <td class="right untranslated">163</td>
     <td class="right">85 %</td>
     <td class="center">2019-07-12</td>
   </tr>
   <tr>
     <td class="left">Japanese</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1071</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">0</td>
+    <td class="right untranslated">3</td>
     <td class="right">100 %</td>
     <td class="center">2021-06-24</td>
   </tr>
   <tr>
     <td class="left">Korean</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">993</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">78</td>
-    <td class="right">93 %</td>
+    <td class="right untranslated">81</td>
+    <td class="right">92 %</td>
     <td class="center">2021-03-30</td>
   </tr>
   <tr>
     <td class="left">Lithuanian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1068</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">3</td>
-    <td class="right">100 %</td>
+    <td class="right untranslated">6</td>
+    <td class="right">99 %</td>
     <td class="center">2021-06-23</td>
   </tr>
   <tr>
     <td class="left">Norwegian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">636</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">435</td>
+    <td class="right untranslated">438</td>
     <td class="right">59 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Persian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">647</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">424</td>
+    <td class="right untranslated">427</td>
     <td class="right">60 %</td>
     <td class="center">2013-08-15</td>
   </tr>
   <tr>
     <td class="left">Polish</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1015</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">56</td>
+    <td class="right untranslated">59</td>
     <td class="right">95 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Portuguese</td>
-    <td class="right">1071</td>
-    <td class="right translated">1024</td>
+    <td class="right">1074</td>
+    <td class="right translated">1071</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">47</td>
-    <td class="right">96 %</td>
-    <td class="center">2021-04-10</td>
+    <td class="right untranslated">3</td>
+    <td class="right">100 %</td>
+    <td class="center">2021-06-25</td>
   </tr>
   <tr>
     <td class="left">Romanian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">565</td>
     <td class="right fuzzy">44</td>
-    <td class="right untranslated">462</td>
+    <td class="right untranslated">465</td>
     <td class="right">57 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Russian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1007</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">64</td>
+    <td class="right untranslated">67</td>
     <td class="right">94 %</td>
     <td class="center">2021-04-29</td>
   </tr>
   <tr>
     <td class="left">Serbian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">635</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">436</td>
+    <td class="right untranslated">439</td>
     <td class="right">59 %</td>
     <td class="center"></td>
   </tr>
   <tr>
     <td class="left">Sinhala</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">569</td>
     <td class="right fuzzy">59</td>
-    <td class="right untranslated">443</td>
-    <td class="right">59 %</td>
+    <td class="right untranslated">446</td>
+    <td class="right">58 %</td>
     <td class="center">2010-12-12</td>
   </tr>
   <tr>
     <td class="left">Slovak</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">981</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">90</td>
-    <td class="right">92 %</td>
+    <td class="right untranslated">93</td>
+    <td class="right">91 %</td>
     <td class="center">2020-11-02</td>
   </tr>
   <tr>
     <td class="left">Slovenian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1025</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">46</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">49</td>
+    <td class="right">95 %</td>
     <td class="center">2021-04-24</td>
   </tr>
   <tr>
     <td class="left">Spanish</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">877</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">194</td>
+    <td class="right untranslated">197</td>
     <td class="right">82 %</td>
     <td class="center">2020-04-03</td>
   </tr>
   <tr>
     <td class="left">Swedish</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1024</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">47</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">50</td>
+    <td class="right">95 %</td>
     <td class="center">2021-04-10</td>
   </tr>
   <tr>
     <td class="left">Turkish</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">1025</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">46</td>
-    <td class="right">96 %</td>
+    <td class="right untranslated">49</td>
+    <td class="right">95 %</td>
     <td class="center">2021-05-24</td>
   </tr>
   <tr>
     <td class="left">Ukrainian</td>
-    <td class="right">1071</td>
+    <td class="right">1074</td>
     <td class="right translated">641</td>
     <td class="right fuzzy">0</td>
-    <td class="right untranslated">430</td>
+    <td class="right untranslated">433</td>
     <td class="right">60 %</td>
     <td class="center">2009-06-13</td>
   </tr>
index 525f6f6..143d95e 100644 (file)
@@ -1,47 +1,47 @@
 # Translations Status
 
-Status from **2021-06-24**:
+Status from **2021-06-26**:
 
 ## WinMerge
 
 | Language             | Total | Translated | Fuzzy | Untranslated | Complete | Last Update |
 |:---------------------|------:|-----------:|------:|-------------:|---------:|:-----------:|
-| Arabic               |  1071 |        908 |     0 |          163 |     85 % |  2019-12-30 |
-| Basque               |  1071 |        644 |     0 |          427 |     60 % |  2013-02-03 |
-| Brazilian            |  1071 |       1024 |     0 |           47 |     96 % |  2021-02-14 |
-| Bulgarian            |  1071 |        951 |     0 |          120 |     89 % |  2021-02-11 |
-| Catalan              |  1071 |        570 |     0 |          501 |     53 % |             |
-| ChineseSimplified    |  1071 |        981 |     0 |           90 |     92 % |             |
-| ChineseTraditional   |  1071 |        861 |     0 |          210 |     80 % |  2010-02-19 |
-| Croatian             |  1071 |        635 |     1 |          435 |     59 % |  2009-02-13 |
-| Czech                |  1071 |        610 |     0 |          461 |     57 % |             |
-| Danish               |  1071 |        644 |     0 |          427 |     60 % |  2013-01-13 |
-| Dutch                |  1071 |       1070 |     0 |            1 |    100 % |  2018-09-06 |
-| English              |  1072 |       1072 |     0 |            0 |    100 % |  2021-06-24 |
-| Finnish              |  1071 |        908 |     0 |          163 |     85 % |             |
-| French               |  1071 |       1025 |     0 |           46 |     96 % |  2021-04-29 |
-| Galician             |  1071 |       1025 |     0 |           46 |     96 % |  2021-04-18 |
-| German               |  1071 |       1025 |     0 |           46 |     96 % |  2021-04-24 |
-| Greek                |  1071 |        608 |     0 |          463 |     57 % |             |
-| Hungarian            |  1071 |       1022 |     0 |           49 |     95 % |  2021-03-15 |
-| Italian              |  1071 |        911 |     0 |          160 |     85 % |  2019-07-12 |
-| Japanese             |  1071 |       1071 |     0 |            0 |    100 % |  2021-06-24 |
-| Korean               |  1071 |        993 |     0 |           78 |     93 % |  2021-03-30 |
-| Lithuanian           |  1071 |       1068 |     0 |            3 |    100 % |  2021-06-23 |
-| Norwegian            |  1071 |        636 |     0 |          435 |     59 % |             |
-| Persian              |  1071 |        647 |     0 |          424 |     60 % |  2013-08-15 |
-| Polish               |  1071 |       1015 |     0 |           56 |     95 % |             |
-| Portuguese           |  1071 |       1024 |     0 |           47 |     96 % |  2021-04-10 |
-| Romanian             |  1071 |        565 |    44 |          462 |     57 % |             |
-| Russian              |  1071 |       1007 |     0 |           64 |     94 % |  2021-04-29 |
-| Serbian              |  1071 |        635 |     0 |          436 |     59 % |             |
-| Sinhala              |  1071 |        569 |    59 |          443 |     59 % |  2010-12-12 |
-| Slovak               |  1071 |        981 |     0 |           90 |     92 % |  2020-11-02 |
-| Slovenian            |  1071 |       1025 |     0 |           46 |     96 % |  2021-04-24 |
-| Spanish              |  1071 |        877 |     0 |          194 |     82 % |  2020-04-03 |
-| Swedish              |  1071 |       1024 |     0 |           47 |     96 % |  2021-04-10 |
-| Turkish              |  1071 |       1025 |     0 |           46 |     96 % |  2021-05-24 |
-| Ukrainian            |  1071 |        641 |     0 |          430 |     60 % |  2009-06-13 |
+| Arabic               |  1074 |        908 |     0 |          166 |     85 % |  2019-12-30 |
+| Basque               |  1074 |        644 |     0 |          430 |     60 % |  2013-02-03 |
+| Brazilian            |  1074 |       1024 |     0 |           50 |     95 % |  2021-02-14 |
+| Bulgarian            |  1074 |        951 |     0 |          123 |     89 % |  2021-02-11 |
+| Catalan              |  1074 |        570 |     0 |          504 |     53 % |             |
+| ChineseSimplified    |  1074 |        981 |     0 |           93 |     91 % |             |
+| ChineseTraditional   |  1074 |        861 |     0 |          213 |     80 % |  2010-02-19 |
+| Croatian             |  1074 |        635 |     1 |          438 |     59 % |  2009-02-13 |
+| Czech                |  1074 |        610 |     0 |          464 |     57 % |             |
+| Danish               |  1074 |        644 |     0 |          430 |     60 % |  2013-01-13 |
+| Dutch                |  1074 |       1070 |     0 |            4 |    100 % |  2018-09-06 |
+| English              |  1075 |       1075 |     0 |            0 |    100 % |  2021-06-26 |
+| Finnish              |  1074 |        908 |     0 |          166 |     85 % |             |
+| French               |  1074 |       1025 |     0 |           49 |     95 % |  2021-04-29 |
+| Galician             |  1074 |       1025 |     0 |           49 |     95 % |  2021-04-18 |
+| German               |  1074 |       1025 |     0 |           49 |     95 % |  2021-04-24 |
+| Greek                |  1074 |        608 |     0 |          466 |     57 % |             |
+| Hungarian            |  1074 |       1055 |     0 |           19 |     98 % |  2021-03-15 |
+| Italian              |  1074 |        911 |     0 |          163 |     85 % |  2019-07-12 |
+| Japanese             |  1074 |       1071 |     0 |            3 |    100 % |  2021-06-24 |
+| Korean               |  1074 |        993 |     0 |           81 |     92 % |  2021-03-30 |
+| Lithuanian           |  1074 |       1068 |     0 |            6 |     99 % |  2021-06-23 |
+| Norwegian            |  1074 |        636 |     0 |          438 |     59 % |             |
+| Persian              |  1074 |        647 |     0 |          427 |     60 % |  2013-08-15 |
+| Polish               |  1074 |       1015 |     0 |           59 |     95 % |             |
+| Portuguese           |  1074 |       1071 |     0 |            3 |    100 % |  2021-06-25 |
+| Romanian             |  1074 |        565 |    44 |          465 |     57 % |             |
+| Russian              |  1074 |       1007 |     0 |           67 |     94 % |  2021-04-29 |
+| Serbian              |  1074 |        635 |     0 |          439 |     59 % |             |
+| Sinhala              |  1074 |        569 |    59 |          446 |     58 % |  2010-12-12 |
+| Slovak               |  1074 |        981 |     0 |           93 |     91 % |  2020-11-02 |
+| Slovenian            |  1074 |       1025 |     0 |           49 |     95 % |  2021-04-24 |
+| Spanish              |  1074 |        877 |     0 |          197 |     82 % |  2020-04-03 |
+| Swedish              |  1074 |       1024 |     0 |           50 |     95 % |  2021-04-10 |
+| Turkish              |  1074 |       1025 |     0 |           49 |     95 % |  2021-05-24 |
+| Ukrainian            |  1074 |        641 |     0 |          433 |     60 % |  2009-06-13 |
 
 ## ShellExtension
 
index 05f13cc..00b4dd7 100644 (file)
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <status>
-  <update>2021-06-24</update>
+  <update>2021-06-26</update>
   <translations project="WinMerge">
     <translation>
       <language>Arabic</language>
       <file>Arabic.po</file>
       <update>2019-12-30</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>908</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>163</untranslated>
+        <untranslated>166</untranslated>
       </strings>
     </translation>
     <translation>
       <file>Basque.po</file>
       <update>2013-02-03</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>644</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>427</untranslated>
+        <untranslated>430</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Brazilian.po</file>
       <update>2021-02-14</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1024</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>47</untranslated>
+        <untranslated>50</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Bulgarian.po</file>
       <update>2021-02-11</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>951</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>120</untranslated>
+        <untranslated>123</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Catalan.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>570</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>501</untranslated>
+        <untranslated>504</untranslated>
       </strings>
       <translators>
         <translator>
       <file>ChineseSimplified.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>981</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>90</untranslated>
+        <untranslated>93</untranslated>
       </strings>
       <translators>
         <translator>
       <file>ChineseTraditional.po</file>
       <update>2010-02-19</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>861</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>210</untranslated>
+        <untranslated>213</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Croatian.po</file>
       <update>2009-02-13</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>635</translated>
         <fuzzy>1</fuzzy>
-        <untranslated>435</untranslated>
+        <untranslated>438</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Czech.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>610</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>461</untranslated>
+        <untranslated>464</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Danish.po</file>
       <update>2013-01-13</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>644</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>427</untranslated>
+        <untranslated>430</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Dutch.po</file>
       <update>2018-09-06</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1070</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>1</untranslated>
+        <untranslated>4</untranslated>
       </strings>
       <translators>
         <translator>
     <translation template="1">
       <language>English</language>
       <file>English.pot</file>
-      <update>2021-06-24</update>
+      <update>2021-06-26</update>
       <strings>
-        <count>1072</count>
-        <translated>1072</translated>
+        <count>1075</count>
+        <translated>1075</translated>
         <fuzzy>0</fuzzy>
         <untranslated>0</untranslated>
       </strings>
       <file>Finnish.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>908</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>163</untranslated>
+        <untranslated>166</untranslated>
       </strings>
     </translation>
     <translation>
       <file>French.po</file>
       <update>2021-04-29</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1025</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>46</untranslated>
+        <untranslated>49</untranslated>
       </strings>
       <translators>
         <translator maintainer="1">
       <file>Galician.po</file>
       <update>2021-04-18</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1025</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>46</untranslated>
+        <untranslated>49</untranslated>
       </strings>
       <translators>
         <translator>
       <file>German.po</file>
       <update>2021-04-24</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1025</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>46</untranslated>
+        <untranslated>49</untranslated>
       </strings>
       <translators>
         <translator maintainer="1">
       <file>Greek.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>608</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>463</untranslated>
+        <untranslated>466</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Hungarian.po</file>
       <update>2021-03-15</update>
       <strings>
-        <count>1071</count>
-        <translated>1022</translated>
+        <count>1074</count>
+        <translated>1055</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>49</untranslated>
+        <untranslated>19</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Italian.po</file>
       <update>2019-07-12</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>911</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>160</untranslated>
+        <untranslated>163</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Japanese.po</file>
       <update>2021-06-24</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1071</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>0</untranslated>
+        <untranslated>3</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Korean.po</file>
       <update>2021-03-30</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>993</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>78</untranslated>
+        <untranslated>81</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Lithuanian.po</file>
       <update>2021-06-23</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1068</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>3</untranslated>
+        <untranslated>6</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Norwegian.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>636</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>435</untranslated>
+        <untranslated>438</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Persian.po</file>
       <update>2013-08-15</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>647</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>424</untranslated>
+        <untranslated>427</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Polish.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1015</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>56</untranslated>
+        <untranslated>59</untranslated>
       </strings>
       <translators>
         <translator>
     <translation>
       <language>Portuguese</language>
       <file>Portuguese.po</file>
-      <update>2021-04-10</update>
+      <update>2021-06-25</update>
       <strings>
-        <count>1071</count>
-        <translated>1024</translated>
+        <count>1074</count>
+        <translated>1071</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>47</untranslated>
+        <untranslated>3</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Romanian.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>565</translated>
         <fuzzy>44</fuzzy>
-        <untranslated>462</untranslated>
+        <untranslated>465</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Russian.po</file>
       <update>2021-04-29</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1007</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>64</untranslated>
+        <untranslated>67</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Serbian.po</file>
       <update></update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>635</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>436</untranslated>
+        <untranslated>439</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Sinhala.po</file>
       <update>2010-12-12</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>569</translated>
         <fuzzy>59</fuzzy>
-        <untranslated>443</untranslated>
+        <untranslated>446</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Slovak.po</file>
       <update>2020-11-02</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>981</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>90</untranslated>
+        <untranslated>93</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Slovenian.po</file>
       <update>2021-04-24</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1025</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>46</untranslated>
+        <untranslated>49</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Spanish.po</file>
       <update>2020-04-03</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>877</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>194</untranslated>
+        <untranslated>197</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Swedish.po</file>
       <update>2021-04-10</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1024</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>47</untranslated>
+        <untranslated>50</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Turkish.po</file>
       <update>2021-05-24</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>1025</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>46</untranslated>
+        <untranslated>49</untranslated>
       </strings>
       <translators>
         <translator>
       <file>Ukrainian.po</file>
       <update>2009-06-13</update>
       <strings>
-        <count>1071</count>
+        <count>1074</count>
         <translated>641</translated>
         <fuzzy>0</fuzzy>
-        <untranslated>430</untranslated>
+        <untranslated>433</untranslated>
       </strings>
       <translators>
         <translator>
index 8fbfb4b..10c522e 100644 (file)
@@ -3647,6 +3647,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index d56301e..2202910 100644 (file)
@@ -4253,6 +4253,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index a5f4440..1643f34 100644 (file)
@@ -4419,6 +4419,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 8c88547..1c0c1ad 100644 (file)
@@ -3726,6 +3726,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index a758a41..7979cdd 100644 (file)
@@ -4184,6 +4184,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index ebcf630..124cddc 100644 (file)
@@ -3686,6 +3686,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index b538807..5b16b30 100644 (file)
@@ -4262,6 +4262,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 3b1a358..746f299 100644 (file)
@@ -4253,6 +4253,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 19f3c48..87059da 100644 (file)
@@ -4186,6 +4186,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index daeeb84..c16b847 100644 (file)
@@ -4291,6 +4291,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 8986545..5ee5a6a 100644 (file)
@@ -1,11 +1,11 @@
 # This file is part from WinMerge <https://winmerge.org/>
 # Released under the "GNU General Public License"
-# 
+#
 # Translators:
 # * Ronald Schaap <ronald at schaap.demon.nl>
 # * Michel Coene
 # Thomas De Rocker, 2021
-# 
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: WinMerge\n"
@@ -3733,6 +3733,15 @@ msgstr "Regels oplopend sorteren"
 msgid "Sort Lines Descending"
 msgstr "Regels aflopend sorteren"
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr "Filteropdracht toepassen..."
 
index 9a9f081..4e944a6 100644 (file)
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: WinMerge\n"
 "Report-Msgid-Bugs-To: https://bugs.winmerge.org/\n"
-"POT-Creation-Date: 2021-06-24 20:41+0000\n"
+"POT-Creation-Date: 2021-06-26 16:58+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: \n"
 "Language-Team: English <winmerge-translate@lists.sourceforge.net>\n"
@@ -3288,6 +3288,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index bb480d9..5e9e961 100644 (file)
@@ -4353,6 +4353,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index b758eb2..dc81dbd 100644 (file)
@@ -4428,6 +4428,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 3e49b2a..7893ab0 100644 (file)
@@ -4420,6 +4420,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 86305a8..009bb0b 100644 (file)
@@ -4037,6 +4037,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index cfe4710..71d21c2 100644 (file)
@@ -4231,6 +4231,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index ceaee9b..4b1f22c 100644 (file)
@@ -4420,6 +4420,15 @@ msgstr "Sorok növekvő rendezése"
 msgid "Sort Lines Descending"
 msgstr "Sorok csökkenőő rendezése""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr "Szűrőparancs alkalmazása..."
 
index 26683d1..2b81d44 100644 (file)
@@ -3668,6 +3668,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 93521d4..200d47d 100644 (file)
@@ -12,7 +12,7 @@ msgstr ""
 "Project-Id-Version: WinMerge\n"
 "Report-Msgid-Bugs-To: https://bugs.winmerge.org/\n"
 "POT-Creation-Date: 2020-12-05 22:07+0000\n"
-"PO-Revision-Date: 2021-06-24 08:54+0900\n"
+"PO-Revision-Date: 2021-06-26 17:03+0900\n"
 "Last-Translator: Takashi Sawanaka <sawanaka@d1.dion.ne.jp>\n"
 "Language-Team: Japanese <winmerge-translate@lists.sourceforge.net>\n"
 "MIME-Version: 1.0\n"
@@ -3680,6 +3680,15 @@ msgstr "昇順にソート"
 msgid "Sort Lines Descending"
 msgstr "降順にソート"
 
+msgid "Reverse Columns"
+msgstr "列を逆順"
+
+msgid "Reverse Lines"
+msgstr "行を逆順"
+
+msgid "Replace..."
+msgstr "置換..."
+
 msgid "Apply Filter Command..."
 msgstr "フィルタコマンドを適用..."
 
index cc193de..88318f5 100644 (file)
@@ -4361,6 +4361,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 01e8435..3a0e6e6 100644 (file)
@@ -3297,6 +3297,15 @@ msgstr "Rikiuoti eilutes didėjimo tvarka"
 msgid "Sort Lines Descending"
 msgstr "Rikiuoti eilutes mažėjimo tvarka"
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr "Pritaikyti filtro komandą..."
 
index eb0f061..4e1d61a 100644 (file)
@@ -4253,6 +4253,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 090eacb..f48ef9f 100644 (file)
@@ -4296,6 +4296,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index de145c9..bf63ff8 100644 (file)
@@ -3294,6 +3294,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 59d5f8a..14232bc 100644 (file)
@@ -3765,6 +3765,15 @@ msgstr "Ordem de linhas ascendente"
 msgid "Sort Lines Descending"
 msgstr "Ordem de linhas descendente"
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr "Aplicar comando de filtro..."
 
index 1ab042f..02cd25d 100644 (file)
@@ -4232,6 +4232,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 4edf81c..0b11255 100644 (file)
@@ -3296,6 +3296,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 5baaac1..b7360f5 100644 (file)
@@ -4225,6 +4225,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index aed805f..df7b341 100644 (file)
@@ -4243,6 +4243,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 6878c19..328351a 100644 (file)
@@ -3709,6 +3709,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 57e1825..a13fb6f 100644 (file)
@@ -4414,6 +4414,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index f68c30d..3fb51c1 100644 (file)
@@ -3685,6 +3685,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 0170da6..fe6de36 100644 (file)
@@ -4392,6 +4392,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index dc0e095..c249f8c 100644 (file)
@@ -3749,6 +3749,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""
 
index 4468368..aaca2eb 100644 (file)
@@ -4253,6 +4253,15 @@ msgstr ""
 msgid "Sort Lines Descending"
 msgstr ""
 
+msgid "Reverse Columns"
+msgstr ""
+
+msgid "Reverse Lines"
+msgstr ""
+
+msgid "Replace..."
+msgstr ""
+
 msgid "Apply Filter Command..."
 msgstr ""