Shell.DeepTarball.lua: макрос для входа в tarball-архивы

Здесь обсуждается всё, что касается макросов.
Post Reply
siberia-man
Posts: 86
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Shell.DeepTarball.lua: макрос для входа в tarball-архивы

Post by siberia-man » Wed 07 Mar, 2018 18:33

Преамбула

Так называемые tarball-архивы - обычное средство распространения данных в юниксах. Обычно они рассматриваются как единая сущность -- tar-архив файлов, упакованный gzip или bzip2. К сожалению ФАР не имеет встроенных средств для показа их (такие архивы) как единую сущность и показывет как два отдельных архива gzip/bzip2 с единственным вложенным tar-архивом. Данный макрос -- попытка "погрузиться" в tarball на максимально возможную глубину до файловой структуры архива, минуя промежуточную стадию входа в gzip/bzip2-архив, затем в tar...

И так...

Амбула

Скрипт пока не выкладываю в готовые решения -- возможны улучшения, дополнения, исправления
  1. -- https://forum.farmanager.com/viewtopic.php?f=15&t=11109
  2.  
  3. -- Enable or disable the macros
  4. local enabled = true
  5.  
  6. ---------------------------------------------------------------------------
  7.  
  8. -- *.tar
  9. local tar_ext = {
  10.     "%.tar",
  11. }
  12.  
  13. -- *.tgz or *.gz
  14. -- *.tbz or *.bz
  15. -- *.tbz2 or *.bz2
  16. -- *.txz or *.xz
  17. local zip_ext = {
  18.     "%.t?gz",
  19.     "%.t?bz2?",
  20.     "%.t?xz",
  21. }
  22.  
  23. -- *.tgz or *.tar.gz
  24. -- *.tbz or *.tar.bz
  25. -- *.tbz2 or *.tar.bz2
  26. -- *.txz or *.tar.xz
  27. local tarball_ext = {
  28.     "%.tgz",   "%.tar%.gz",
  29.     "%.tbz2?", "%.tar%.bz2?",
  30.     "%.txz",   "%.tar%.xz",
  31. }
  32.  
  33. local function is_file(f, ext)
  34.     f = f:lower()
  35.     for i = 1, #ext do
  36.         if f:match("("..ext[i]..")$") then return true end
  37.     end
  38.     return false
  39. end
  40.  
  41. local function is_tar(f)
  42.     return is_file(f, tar_ext)
  43. end
  44.  
  45. local function is_zip(f)
  46.     return is_file(f, zip_ext)
  47. end
  48.  
  49. local function is_tarball(f)
  50.     return is_file(f, tarball_ext)
  51. end
  52.  
  53. ---------------------------------------------------------------------------
  54.  
  55. Macro {
  56.     area = "Shell";
  57.     key = "Enter CtrlPgDn";
  58.     description = "Deep Tarball: Enter the archive";
  59.     condition = function()
  60.         return enabled and is_tarball(APanel.Current)
  61.     end;
  62.     action = function()
  63.         Keys("AKey Down AKey")
  64.     end;
  65. }
  66.  
  67. Macro {
  68.     area = "Shell";
  69.     key = "Enter CtrlPgUp";
  70.     description = "Deep Tarball: Exit the archive";
  71.     condition = function()
  72.         return enabled and ( APanel.Current == ".." or is_tar(APanel.HostFile) )
  73.     end;
  74.     action = function()
  75.         Keys("AKey")
  76.         if APanel.Plugin and is_zip(APanel.HostFile) then Keys("Up AKey") end
  77.     end;
  78. }
  79.  
  80. ---------------------------------------------------------------------------
  81.  
  82. -- EOF
Last edited by siberia-man on Thu 08 Mar, 2018 10:06, edited 5 times in total.

siberia-man
Posts: 86
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Shell.DeepTarball.lua: макрос для входа в tarball-архивы

Post by siberia-man » Thu 08 Mar, 2018 08:51

Обновления:
-- косметические исправления сообщения выше
-- разделил код на список расширений и функции определения типа архива
-- расширил макрос на xz-архивы
-- регистронезависимое сравнение (предложение коллеги Shmuel)

Исправления, дополнения, пожелания - приветствуются.
Last edited by siberia-man on Thu 08 Mar, 2018 10:02, edited 1 time in total.

Shmuel
Posts: 5645
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 194 times

Shell.DeepTarball.lua: макрос для входа в tarball-архивы

Post by Shmuel » Thu 08 Mar, 2018 08:58

У вас все расширения файлов указаны в нижнем регистре, а функция match - регистрозависимая. Поэтому можно сделать так:

Code: Select all

local function is_file(f, ext)
    f = f:lower() -- добавленная строка
    for i = 1, #ext do
        if f:match("("..ext[i]..")$") then return true end
    end
    return false
end

siberia-man
Posts: 86
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Shell.DeepTarball.lua: макрос для входа в tarball-архивы

Post by siberia-man » Thu 08 Mar, 2018 09:58

Shmuel, спасибо. Учтено.

Update
Поправил первый пост.
Last edited by siberia-man on Thu 08 Mar, 2018 09:58, edited 1 time in total.

Post Reply

Return to “Обсуждение макросов”