Страница 1 из 1

Структурирование файла главного меню Total Commandera

Добавлено: Вс сен 19, 2010 20:37
Andrey_A
Тут, намедни, смотрел, разбирал файлы Wcmd_*.mnu разных языков и сборок... и пришла идея о создании скрипта по структурированию файла. В большинстве того, что я видел структура была либо по первому столбцу, либо как попало. Да и свой файл, в котором 3300 строк руки не добирались всё расставить на свои места. А после использования этого скрипта смотреть такие файлы стало намного веселее и приятнее. Испытывал примерно на 40 разных файлах, всё работает, но если будут какие-то дополнения со стороны профессионалов, я всегда за!

Код: Выделить всё

'=============================================================== 
' Структурирование файла Wcmd_*.MNU главного меню Total Commandera
' В параметрах вызова из TC должен быть прописано путь к файлу: 
' "%%COMMANDER_PATH%%\Language\Wcmd_Rus.mnu"
' или открывать его подкурсором %P%N
' Автор Аверин Андрей 2010
'=============================================================== 
Option Explicit
Dim FSO, ListFile, SetList, Text, MyFile, i,k,sym,FF,F,P,L,ContrStr,Stroka,Probel,Space
Set FSO = CreateObject("Scripting.FileSystemObject")
     With WScript 
         FF   = .Arguments(0) 
      End With 
         F = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(FF)) 
         Set ListFile = FSO.OpenTextFile(F, 1)
  Text =  ""
  ContrStr = 0
  Space = 7           'изменить если нужен отступ больше или меньше
  P = 0                    
  Do While Not ListFile.AtEndOfStream
     SetList = ListFile.ReadLine
       Stroka = ""
       Probel = ""
       
       For i = 1 To Len(SetList)
                 sym = mid(SetList,i,1)
                      If sym = "P" or sym = "M" or sym = "E" or sym = "S" or sym = "H"or sym = ";" Then
                           If   sym = ";" Then
                                    L = 0
                           End If
                             k = i
                             i = Len(SetList)                        
                      End If
      Next
   If  SetList <> "" Then
       For i = k To Len(SetList)
                 sym = mid(SetList,i,1)
                 Stroka = Stroka & sym                        
      Next
   End If   
                      If P < 0 Then P = 0
                      
                      If  mid(Stroka ,1,1) = "P" Then
                                If  ContrStr = 1 Then
                                       P = P + Space
                                End If
                          L = P
                          ContrStr = 1
                      End If
                      
                      If  mid(Stroka ,1,1) = "M" Then
                                If  ContrStr = 2 Then
                                       P = P - Space
                                       ContrStr = 1
                                End If                      
                             L = P + Space
                      End If

                      If  Stroka = "MENUITEM SEPARATOR" Then
                                If  ContrStr = 2 Then
                                       P = P - Space
                                       ContrStr = 1
                                End If                      
                             L = P + Space*2
                      End If

                      If  mid(Stroka ,1,1) = "E" Then
                                If  ContrStr = 2 Then
                                       P = P - Space
                                End If
                          L = P
                          ContrStr = 2
                      End If                      

          For i = 1 To L
                Probel = Probel & " "    
          Next
             Text = Text & Probel & Stroka & vbNewLine
             L = 0
Loop

  FSO.CopyFile F, F & ".bak" ' За\Рас комментируйте если нужна копия файла
  Set MyFile= fso.CreateTextFile(F, True) 
   MyFile.Write(Text) 

   ListFile.Close
   Set ListFile = Nothing
   Set FSO = Nothing
   WScript.Quit

Добавлено: Вс сен 19, 2010 20:57
Avada
Andrey_A
Не понял саму постановку проблемы. Что означает "по первой строке либо как попало", что конкретно предлагается взамен и что вообще понимается здесь под структурированием? Желательно уяснить это не из созерцания скрипта, а из удобопонятного комментария к оному.
Кстати, в конце скрипта, наверное "копия файлов"?

Добавлено: Вс сен 19, 2010 21:22
Andrey_A
Поправил "по первому столбцу".
Дополняю. Вот я просматриваю файл меню и смотрю, а в нём команды записаны таким вот образом - без отступов на разных уровнях:

Код: Выделить всё

POPUP ""
MENUITEM ""
POPUP ""
MENUITEM ""
POPUP ""
MENUITEM ""
END_POPUP ""
MENUITEM ""
END_POPUP ""
MENUITEM SEPARATOR
MENUITEM ""
END_POPUP ""
Меню само работает, всё хорошо, но разобраться в нём не всегда легко, а если меню несколько листов, а если есть несколько уровней вложенности, а если не дай бог какая-то ошибка, то теряешь кучу времени на то, чтобы разобраться...
Скрипт преобразует тоже меню следующим образом, что гораздо удобнее в работе и приятнее глазу

Код: Выделить всё

POPUP ""
     MENUITEM ""
          POPUP ""
               MENUITEM ""
                    POPUP ""
                         MENUITEM ""
                    END_POPUP ""
               MENUITEM ""
         END_POPUP ""
            MENUITEM SEPARATOR
     MENUITEM ""
END_POPUP ""
К примеру, тот же самый скрипт я бы выложил без пробелов, без отступов...

Добавлено: Вс сен 19, 2010 21:34
Avada
Andrey_A
Угу, теперь стало несколько понятнее. Хотя, скажем, в нашей русификации для меню отступы используются и принцип "чем глубже — тем правее" вроде бы никогда не нарушался. А для разбирательства с меню лично я предпочитаю Main Menu Editor, где вся эта структура отображается в виде дерева и отступов не быть просто не может. Впрочем, это дело вкуса, конечно.

Добавлено: Вс сен 19, 2010 22:33
Flasher
Avada писал(а):А для разбирательства с меню лично я предпочитаю Main Menu Editor
В котором до сих пор не решена проблема с юникодностью mnu.

Поэтому отдаю дань уважения проделанной работе Андрея. Молодец!Изображение

Добавлено: Вс сен 19, 2010 22:53
Avada
Flasher писал(а):В котором до сих пор не решена проблема с юникодностью mnu.
Для начала его надо убедить, что это в самом деле проблема, требующая безусловного решения... Впрочем, поскольку начался очередной этап моего общения с автором по поводу новой версии пакета, мы к этому вопросу ещё вернёмся. Но не здесь и не сейчас.