Как отличить просто строку от GUID-а "во внутреннем представлении" Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

Здравствуйте, уважаемые знатоки!
Мне нужен совет.
Имеется поле таблицы, которое может содержать GUID "во внутреннем представлении" - 16-байтовая строка (например, panel.GetPanelInfo(nil, 1).OwnerGuid). Как можно определить, что строка содержит именно GUID?
Вы не поверите: строка C:\Program Files тоже может быть принята за GUID! И его можно преобразовать во внешнее представление (win.Uuid(…)='505C3A43-6F72-7267-616D-2046696C6573')! Может, оценивать строку по длине (16 байт) и по not utf8.utf8valid(…)? Есть какие-то мысли / знания?
2useven10
Posts: 5226
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 314 times

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by 2useven10 »

GUID может быть любой 16-байтовой строкой.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by citRiks »

Я думаю можно оценивать рандомность этих 16 байтов.
или это можно назвать "энтропией", наверное.
У "C:\PRogram Files\" будет низкая энтропия,
так как большинство байтов лежат в довольно узком буквенном диапазоне из 24 байтов.
а у байтов взятых из win.Uuid() будет полный раздрай и разброс по всему диапазону из 255 байтов.
Понятно что существует гипотетическая вероятность что win.Uuid() может выдать "C:\PRogram Files\",
но это чисто гипотетическая вероятнсть которой можно пренебречь
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by John Doe »

buniak_a_h wrote: Sat 24 Apr, 2021 04:19 Как можно определить, что строка содержит именно GUID?
В некоторых местах луафар бинарные гуиды дополнительно упаковывает в таблицу, для однозначности.
А чтобы ответить на ваш вопрос, надо бы начать с того, для какой задачи это требуется.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

John Doe wrote: Sat 24 Apr, 2021 08:20 для какой задачи это требуется
Визуализирую таблицу (с редактированием в перспективе). В ней в некоторых полях храниться GUID. Хотелось:
а) показывать такое поле примерно так: ��N� K��i,�6�M (GUID="4EBBEFC8-2084-4B7F-94C0-692CE136894D")
б) в случае, если будет редактирование, автоматически в поле DI_EDIT в качестве начального значение "внешнее представление" (в примере выше - то, что после GUID=), а после редактирования - помещать в поле таблицы win.Uuid(введённого-значения).
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by John Doe »

buniak_a_h wrote: Sat 24 Apr, 2021 08:31 Визуализирую таблицу
Если это произвольная таблица, и о структуре данных вы ничего заранее не знаете, то только эвристика.
Но если бы делал я, то не умничал бы, и показывал скобках любые гуиды выглядящие корректными, а редактирование строкового представления повесил бы на отдельный хоткей.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

Кстати, интересующимся.
Модуль получился примерно таким:
  1. local Version = "1.1.1"
  2.  
  3. local F = far.Flags
  4.  
  5.  
  6.  
  7. ----[[*D*]]local le=require"le"
  8.  
  9. local TreeTbl
  10.  
  11.  
  12.  
  13. local Info = package.loaded.regscript or function(...) return ... end
  14.  
  15. local nfo = Info {_filename or ...,
  16.  
  17.   name        = "TableAsTree";
  18.  
  19.   description = "Представление таблицы в виде дерева в диалоге";
  20.  
  21.   version     = Version;
  22.  
  23.   author      = "BAX";
  24.  
  25.   url         = "";
  26.  
  27.   id          = "64220FEB-E3C4-480B-B939-294D02067EA9";
  28.  
  29.   history     = [[
  30.  
  31. 22.04.2021 v1.1.1 - стартовая версия
  32.  
  33. ]];
  34.  
  35.   --parent_id   = "";
  36.  
  37.   --minfarversion = {3,0,0,4744,0};
  38.  
  39.   --files       = "*.cfg;*.ru.lng";
  40.  
  41.   --config      = function(nfo,name) end;
  42.  
  43.   help        = function(nfo,name) TreeTbl('?')end;
  44.  
  45.   execute     = function(...) return TreeTbl(...) end;
  46.  
  47.  
  48.  
  49.   --disabled    = false;
  50.  
  51.   --options     = {};
  52.  
  53.   restriction = [[
  54.  
  55. Внимание!
  56.  
  57. В случае циклических ссылок программа зациклится!
  58.  
  59. ]]
  60.  
  61. }
  62.  
  63. if not nfo then return end
  64.  
  65. --local O = nfo.options
  66.  
  67.  
  68.  
  69.  
  70.  
  71. -----------------------------------------------------
  72.  
  73. local DialogTools = require"BAX.DialogTools"
  74.  
  75. local DialogItem = DialogTools.DialogItem
  76.  
  77. -----------------------------------------------------
  78.  
  79. local function ValToStr(v)
  80.  
  81.  if type(v) == 'table' or v == nil then
  82.  
  83.   return ''
  84.  
  85.  elseif type(v) == 'string' and string.len(v) == 16 and
  86.  
  87.         win.Uuid(v) and not utf8.utf8valid(v) then
  88.  
  89.   return ' = ' .. v .. ' (GUID="' .. win.Uuid(v):upper() .. '")', true
  90.  
  91.  else
  92.  
  93.   return ' = ' ..tostring(v)
  94.  
  95.  end
  96.  
  97. end -- ValToStr
  98.  
  99. -----------------------------------------------------
  100.  
  101. local function SubTree(sName, Tbl, Prnt, sPref, nDepth, ChkDbl, Title)
  102.  
  103.  ChkDbl = ChkDbl or {}
  104.  
  105.  sName = sName or '…'
  106.  
  107.  Title = Title or sName
  108.  
  109.  local aSubTree = {}
  110.  
  111.  do
  112.  
  113.   local aIndexes = {}
  114.  
  115.   local j = next(Tbl)
  116.  
  117.   while j do
  118.  
  119.    aIndexes[#aIndexes+1] = j
  120.  
  121.    j = next(Tbl, j)
  122.  
  123.   end
  124.  
  125.   table.sort(aIndexes,
  126.  
  127.     function(a1, a2)
  128.  
  129.      if type(a1) ~= type(a2) then
  130.  
  131.       return type(a1) < type(a2)
  132.  
  133.      else
  134.  
  135.       return a1 < a2
  136.  
  137.      end
  138.  
  139.     end
  140.  
  141.   )
  142.  
  143.   for _,i in ipairs(aIndexes) do
  144.  
  145.    local v = Tbl[i]
  146.  
  147.    local _Name
  148.  
  149.    if type(i) == 'number' then
  150.  
  151.     _Name = '['..i..']'
  152.  
  153.    elseif type(i) == 'string' then
  154.  
  155.     _Name = i
  156.  
  157.    else
  158.  
  159.     _Name = '['..tostring(i)..']'
  160.  
  161.    end
  162.  
  163.    aSubTree[#aSubTree+1] = {Name=_Name; v=v; UserData={}; Parent=Prnt; Level=nDepth+1}
  164.  
  165.    if Prnt then Prnt.CanCollapse = true end
  166.  
  167.   end
  168.  
  169.  end
  170.  
  171.  if #aSubTree > 0 then
  172.  
  173.   for i=1, #aSubTree-1 do
  174.  
  175.    local v = aSubTree[i]
  176.  
  177.    local vStr,IsGUID = ValToStr(v.v)
  178.  
  179.    v.Text = sPref .. '├─' .. v.Name .. vStr
  180.  
  181.    v.lc = string.len(v.Text) - string.len(vStr)
  182.  
  183.    v.Guid = IsGUID
  184.  
  185.    v.UserData.ShowName = v.Text
  186.  
  187.    v.UserData.FullName = sName .. '.' .. v.Name
  188.  
  189.   end
  190.  
  191.   do
  192.  
  193.    local vStr,IsGUID =  ValToStr(aSubTree[#aSubTree].v)
  194.  
  195.    local iSubTree = aSubTree[#aSubTree]
  196.  
  197.    iSubTree.Text = sPref .. '└─' .. iSubTree.Name .. vStr
  198.  
  199.    iSubTree.lc = string.len(iSubTree.Text) - string.len(vStr)
  200.  
  201.    iSubTree.Guid = IsGUID
  202.  
  203.    iSubTree.UserData.ShowName = iSubTree.Text
  204.  
  205.    iSubTree.UserData.FullName = sName .. '.' .. iSubTree.Name
  206.  
  207.   end
  208.  
  209.  end
  210.  
  211.  do
  212.  
  213.   local i = 1
  214.  
  215.   while i <= #aSubTree do
  216.  
  217.    local vRoot = aSubTree[i].v
  218.  
  219.    if type(vRoot) == 'table' then
  220.  
  221.     if not ChkDbl[vRoot] then
  222.  
  223.      ChkDbl[vRoot] = {FullName=aSubTree[i].UserData.FullName or Title; RefItem=aSubTree[i]}
  224.  
  225.      local aa = SubTree(sName .. '.' .. aSubTree[i].Name, vRoot, aSubTree[i], sPref .. (i==#aSubTree and '  ' or '│ '), nDepth+1, ChkDbl, Title)
  226.  
  227.      for _,v in ipairs(aa) do
  228.  
  229.       i = i + 1
  230.  
  231.       table.insert(aSubTree, i, v)
  232.  
  233.      end
  234.  
  235.     else
  236.  
  237.      aSubTree[i].Text = aSubTree[i].Text .. ' ┄┄┄┄╛ …' .. ChkDbl[vRoot].FullName:sub(Title:len()+1)
  238.  
  239.      aSubTree[i].RefItem = ChkDbl[vRoot].RefItem
  240.  
  241.     end
  242.  
  243.    end
  244.  
  245.    i = i + 1
  246.  
  247.   end
  248.  
  249.  end
  250.  
  251.  return aSubTree
  252.  
  253. end -- SubTree
  254.  
  255. -----------------------------------------------------
  256.  
  257. local function ShowTree(sName, aTbl, a_Tree, CanEdit)
  258.  
  259.  local w,h = math.floor(Far.Width * 2 / 3), math.floor(Far.Height * 2 / 3)
  260.  
  261.  local aDlg = {
  262.  
  263.   DialogItem{'DI_LISTBOX', 3,0,w-4,h-4, Flags='DIF_LISTNOCLOSE|DIF_LISTWRAPMODE', List=a_Tree; Text=sName; Name='Tree'};
  264.  
  265.   DialogItem{'DI_TEXT', 3,h-3; Name='Text'};
  266.  
  267.   DialogItem{'DI_EDIT', 3, h-2, w-4, Flags=(CanEdit and 'DIF_NONE' or 'DIF_READONLY'); Name='Value'}
  268.  
  269.  }
  270.  
  271.  local function fDlg(hDlg, Msg, Param1, Param2)
  272.  
  273.   local function ByName(name)
  274.  
  275.    for i,v in ipairs(aDlg) do
  276.  
  277.     if v.Name == name then return i end
  278.  
  279.    end
  280.  
  281.   end
  282.  
  283.   local function ASCAN(tbl, what)
  284.  
  285.    for i,v in ipairs(tbl) do
  286.  
  287.     if v == what then return i end
  288.  
  289.    end
  290.  
  291.   end
  292.  
  293.   local function ChkVis(iCurr)
  294.  
  295.    local parnt, Visible = a_Tree[iCurr].Parent, true
  296.  
  297.    while parnt do
  298.  
  299.     if parnt.Collapsed then
  300.  
  301.      Visible = false
  302.  
  303.      break
  304.  
  305.     end
  306.  
  307.     parnt = parnt.Parent
  308.  
  309.    end
  310.  
  311.    return Visible
  312.  
  313.   end -- ChkVis
  314.  
  315.   local Cont = true
  316.  
  317.   while Cont do
  318.  
  319.    Cont = false
  320.  
  321.    if Msg == F.DN_INITDIALOG then
  322.  
  323.     Msg = F.DN_LISTCHANGE
  324.  
  325.     --Param1 = 1
  326.  
  327.     Param2 = 1
  328.  
  329.     Cont = true
  330.  
  331.    elseif Msg == F.DN_LISTCHANGE then
  332.  
  333.     local iEdit = ByName'Value'
  334.  
  335.     local OldPos = hDlg:send(F.DM_LISTGETCURPOS, ByName"Tree").SelectPos
  336.  
  337.     local iType = ASCAN({'boolean','number','string'}, type(a_Tree[OldPos].v))
  338.  
  339.     if CanEdit and iType then
  340.  
  341.      -- Запоминание изменения
  342.  
  343.      local NewValue = hDlg:send(F.DM_GETTEXT, iEdit)
  344.  
  345.      local Changed = NewValue ~= a_Tree[OldPos].v
  346.  
  347.      if Changed then
  348.  
  349.       NewValue = ({function(a) return a == 'true' or a == 1 end;
  350.  
  351.                    function(a) return tonumber(a) end;
  352.  
  353.                    function(a) return a end;
  354.  
  355.                   })[iType](NewValue)
  356.  
  357.       if NewValue ~= nil then
  358.  
  359.        -- Отдельная обработка GUID-а
  360.  
  361.        if a_Tree[OldPos].Guid then NewValue = win.Uuid(NewValue) end
  362.  
  363.        a_Tree[OldPos].v = NewValue
  364.  
  365.        a_Tree[OldPos].Text = string.sub(a_Tree[OldPos].Text, 1, a_Tree[OldPos].lc) .. ValToStr(NewValue)
  366.  
  367.        hDlg:send(F.DM_SETTEXT, ByName"Tree", a_Tree[OldPos].Text)
  368.  
  369.       end
  370.  
  371.      end
  372.  
  373.     end
  374.  
  375.     iType = ASCAN({'boolean','number','string'}, type(a_Tree[Param2].v))
  376.  
  377.     if Param2 > 1 then
  378.  
  379.      hDlg:send(F.DM_SETTEXT, ByName('Text'), far.TruncStr(('%2d. %s'):format(a_Tree[Param2].Level, a_Tree[Param2].UserData.FullName), w-6) )
  380.  
  381.      hDlg:send(F.DM_SETTEXT, ByName('Value'), (a_Tree[Param2].Guid and win.Uuid(a_Tree[Param2].v):upper() or tostring(a_Tree[Param2].v)))
  382.  
  383.      hDlg:send(F.DM_ENABLE, ByName('Value'), (iType and 1 or 0) )
  384.  
  385.     else
  386.  
  387.      hDlg:send(F.DM_SETTEXT, ByName('Text'), ('%2d. %s'):format(a_Tree[Param2].Level, sName) )
  388.  
  389.      hDlg:send(F.DM_SETTEXT, ByName('Value'), '')
  390.  
  391.      hDlg:send(F.DM_ENABLE, ByName('Value'), 0 )
  392.  
  393.     end
  394.  
  395.    elseif Msg == F.DN_CONTROLINPUT and Param2.EventType == F.KEY_EVENT and Param1 == ByName"Tree" then
  396.  
  397.     local aCurrListPos = hDlg:send(F.DM_LISTGETCURPOS, ByName('Tree'))
  398.  
  399.     local CurrListPos = aCurrListPos.SelectPos
  400.  
  401.     local CurrLvl = a_Tree[CurrListPos].Level
  402.  
  403.     local key = far.InputRecordToName(Param2)
  404.  
  405.     if key == 'Enter' then
  406.  
  407.      if a_Tree[CurrListPos].CanCollapse then
  408.  
  409.       a_Tree[CurrListPos].Collapsed = not a_Tree[CurrListPos].Collapsed
  410.  
  411.       local sStr, Lvl = a_Tree[CurrListPos].Text, (a_Tree[CurrListPos].Level-1)*2
  412.  
  413.       hDlg:send(F.DM_ENABLEREDRAW, 0)
  414.  
  415.       for i=CurrListPos+1, #a_Tree do
  416.  
  417.        if a_Tree[i].Level <= CurrLvl then break end
  418.  
  419.        if not not a_Tree[i].Flags.LIF_HIDDEN == ChkVis(i) then
  420.  
  421.         a_Tree[i].Flags.LIF_HIDDEN = not a_Tree[i].Flags.LIF_HIDDEN
  422.  
  423.         hDlg:send(F.DM_LISTUPDATE, ByName('Tree'), a_Tree[i])
  424.  
  425.        end
  426.  
  427.       end
  428.  
  429.       if Lvl > 0 then
  430.  
  431.        sStr = sStr:sub(1,Lvl-1) .. (a_Tree[CurrListPos].Collapsed and '╥' or '─') .. sStr:sub(Lvl+1)
  432.  
  433.        a_Tree[CurrListPos].Text = sStr
  434.  
  435.        hDlg:send(F.DM_SETTEXT, ByName('Tree'), sStr)
  436.  
  437.       end
  438.  
  439.       hDlg:send(F.DM_ENABLEREDRAW, 1)
  440.  
  441.      elseif a_Tree[CurrListPos].RefItem then
  442.  
  443.       local RefIndex = ASCAN(a_Tree, a_Tree[CurrListPos].RefItem)
  444.  
  445.       if RefIndex then
  446.  
  447.        local aPos = hDlg:send(F.DM_LISTGETCURPOS, ByName"Tree")
  448.  
  449.        aPos.SelectPos = RefIndex
  450.  
  451.        hDlg:send(F.DM_LISTSETCURPOS, ByName"Tree", aPos)
  452.  
  453.       end
  454.  
  455.      end
  456.  
  457.      return true
  458.  
  459.     elseif key == 'Left' then
  460.  
  461.      for i=CurrListPos-1, 1, -1 do
  462.  
  463.       if a_Tree[i].Level < CurrLvl then
  464.  
  465.        hDlg:send(F.DM_LISTSETCURPOS, ByName('Tree'), {TopPos=aCurrListPos.TopPos, SelectPos=i})
  466.  
  467.        return true
  468.  
  469.       end
  470.  
  471.      end
  472.  
  473.      hDlg:send(F.DM_LISTSETCURPOS, ByName('Tree'), {SelectPos=1})
  474.  
  475.      return true
  476.  
  477.     elseif key == 'Right' then
  478.  
  479.      for i=CurrListPos+1, #a_Tree do
  480.  
  481.       if a_Tree[i].Level <= CurrLvl then
  482.  
  483.        hDlg:send(F.DM_LISTSETCURPOS, ByName('Tree'), {aCurrListPos.TopPos,SelectPos=i})
  484.  
  485.        return true
  486.  
  487.       end
  488.  
  489.      end
  490.  
  491.      hDlg:send(F.DM_LISTSETCURPOS, ByName('Tree'), {SelectPos=#a_Tree})
  492.  
  493.      return true
  494.  
  495.     elseif key == 'CtrlUp' or key == 'CtrlDown' then
  496.  
  497.      local iEnd, iStep = key == 'CtrlUp' and 1 or #a_Tree, key == 'CtrlUp' and -1 or 1
  498.  
  499.      local iStart = CurrListPos + iStep
  500.  
  501.      for i=iStart, iEnd, iStep do
  502.  
  503.       if a_Tree[i].Level == CurrLvl then
  504.  
  505.        local aPos = hDlg:send(F.DM_LISTGETCURPOS, ByName"Tree")
  506.  
  507.        aPos.SelectPos = i
  508.  
  509.        hDlg:send(F.DM_LISTSETCURPOS, ByName'Tree', aPos)
  510.  
  511.        return true
  512.  
  513.       end
  514.  
  515.      end
  516.  
  517.     --elseif key == 'CtrlF1' then
  518.  
  519.     -- le(a_Tree[CurrListPos], '201: a_Tree['..CurrListPos..']')
  520.  
  521.     -- *D* }
  522.  
  523.     end
  524.  
  525.    end -- case Msg of
  526.  
  527.   end -- while Cont do
  528.  
  529.  end -- fDlg
  530.  
  531.  far.Dialog('7E1C96F8-D1DA-4154-8CB6-51C6F5F67F46', -1,-1, w,h,nil,aDlg, nil, fDlg)
  532.  
  533. end -- ShowTree
  534.  
  535. -----------------------------------------------------
  536.  
  537. TreeTbl = function(Tbl, Title, CanEdit)
  538.  
  539.  local aTree = SubTree(Title, Tbl, nil, '', 1)
  540.  
  541.  table.insert(aTree, 1, {Text=Title, UserData={FullName=Title}; Level=1})
  542.  
  543.  for i,v in ipairs(aTree) do
  544.  
  545.   v.Index = i
  546.  
  547.   v.Flags = {}
  548.  
  549.  end
  550.  
  551.  ShowTree(Title, Tbl, aTree, CanEdit)
  552.  
  553. end -- TreeTbl
  554.  
  555. -----------------------------------------------------
  556.  
  557. return {
  558.  
  559.   Version = Version;
  560.  
  561.   TreeTable = TreeTbl;
  562.  
  563.   Prompt = 'Вызов:  require"BAX.TreeTable".TreeTable(Table, Title)';
  564.  
  565.        }
Вызов Выглядит так:

Code: Select all

local TreeTable = require"BAX.TreeTable"
local TreeTbl = TreeTable.TreeTable
local Tbl = nil
local FName = far.InputBox(win.Uuid'31E95949-554E-43B2-8C55-882D75A5960A', 'Тест', 'Введите имя файла с таблицей',nil,
                           [[D:\Downloads\Архивы\4Far\000\From Ann\all.cfg]],nil,nil,{FIB_BUTTONS=1,FIB_EDITPATH=1})
if FName then
 local fFun = loadfile(FName)
 if type(fFun) == 'function' then
  Tbl = fFun()
 end
end
if type(Tbl) ~= 'table' then return end
TreeTbl(Tbl, mf.fsplit(FName, 12))
Ну и для проерки требуется файл с таблицей:
  1. local idx={}; for i=1,26 do idx[i]={} end
  2.  
  3. do local t=idx[1]
  4.  
  5.   t[1] = idx[2]
  6.  
  7.   t["Version"] = 2
  8.  
  9. end
  10.  
  11. do local t=idx[2]
  12.  
  13.   t["NameCtx"] = "Work.Редактирование SaveContext и языковых файлов"
  14.  
  15.   t["Context"] = idx[3]
  16.  
  17. end
  18.  
  19. do local t=idx[3]
  20.  
  21.   t["APanel"] = idx[4]
  22.  
  23.   t["Windows"] = idx[12]
  24.  
  25.   t["DriveGUIDs"] = idx[18]
  26.  
  27.   t["Version"] = 4
  28.  
  29.   t["PPanel"] = idx[19]
  30.  
  31.   t["Env"] = idx[26]
  32.  
  33. end
  34.  
  35. do local t=idx[4]
  36.  
  37.   t["Path"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext"
  38.  
  39.   t["Left"] = false
  40.  
  41.   t["Filter"] = idx[5]
  42.  
  43.   t["PanelDirectory"] = idx[9]
  44.  
  45.   t["Info"] = idx[10]
  46.  
  47.   t["Current"] = "SaveContextRus.lng"
  48.  
  49.   t["Path0"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext"
  50.  
  51.   t["HostFile"] = ""
  52.  
  53.   t["Plugin"] = false
  54.  
  55. end
  56.  
  57. do local t=idx[5]
  58.  
  59.   t["Named"] = idx[6]
  60.  
  61.   t["Ext"] = idx[7]
  62.  
  63. end
  64.  
  65. do local t=idx[7]
  66.  
  67.   t["+"] = idx[8]
  68.  
  69. end
  70.  
  71. do local t=idx[8]
  72.  
  73.   t[1] = "*.hlf"
  74.  
  75.   t[2] = "*.lng"
  76.  
  77.   t[3] = "*.lua"
  78.  
  79. end
  80.  
  81. do local t=idx[9]
  82.  
  83.   t["File"] = ""
  84.  
  85.   t["Param"] = ""
  86.  
  87.   t["Name"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext"
  88.  
  89.   t["PluginId"] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  90.  
  91. end
  92.  
  93. do local t=idx[10]
  94.  
  95.   t["ViewMode"] = 2
  96.  
  97.   t["SortMode"] = 2
  98.  
  99.   t["PanelType"] = 0
  100.  
  101.   t["PanelRect"] = idx[11]
  102.  
  103.   t["TopPanelItem"] = 1
  104.  
  105.   t["ItemsNumber"] = 7
  106.  
  107.   t["OwnerGuid"] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  108.  
  109.   t["CurrentItem"] = 7
  110.  
  111.   t["Flags"] = 12587
  112.  
  113.   t["SelectedItemsNumber"] = 1
  114.  
  115. end
  116.  
  117. do local t=idx[11]
  118.  
  119.   t["right"] = 147
  120.  
  121.   t["left"] = 74
  122.  
  123.   t["bottom"] = 31
  124.  
  125.   t["top"] = 0
  126.  
  127. end
  128.  
  129. do local t=idx[12]
  130.  
  131.   t[1] = idx[13]
  132.  
  133.   t[2] = idx[14]
  134.  
  135.   t[3] = idx[15]
  136.  
  137.   t[4] = idx[16]
  138.  
  139.   t[5] = idx[17]
  140.  
  141. end
  142.  
  143. do local t=idx[13]
  144.  
  145.   t["Pos"] = 1
  146.  
  147.   t["Id"] = 0
  148.  
  149.   t["Type"] = 0
  150.  
  151.   t["Flags"] = 0
  152.  
  153.   t["Name"] = ""
  154.  
  155.   t["TypeName"] = "Desktop"
  156.  
  157. end
  158.  
  159. do local t=idx[14]
  160.  
  161.   t["Flags"] = 0
  162.  
  163.   t["Pos"] = 2
  164.  
  165.   t["TypeName"] = "Edit"
  166.  
  167.   t["Id"] = 0
  168.  
  169.   t["Type"] = 3
  170.  
  171.   t["CodePage"] = 65001
  172.  
  173.   t["Name"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext\\SaveContext.lua"
  174.  
  175.   t["Locked"] = false
  176.  
  177. end
  178.  
  179. do local t=idx[15]
  180.  
  181.   t["Flags"] = 0
  182.  
  183.   t["Pos"] = 3
  184.  
  185.   t["TypeName"] = "Edit"
  186.  
  187.   t["Id"] = 1
  188.  
  189.   t["Type"] = 3
  190.  
  191.   t["CodePage"] = 65001
  192.  
  193.   t["Name"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext\\SaveContextEng.lng"
  194.  
  195.   t["Locked"] = false
  196.  
  197. end
  198.  
  199. do local t=idx[16]
  200.  
  201.   t["Flags"] = 0
  202.  
  203.   t["Pos"] = 4
  204.  
  205.   t["TypeName"] = "Edit"
  206.  
  207.   t["Id"] = 2
  208.  
  209.   t["Type"] = 3
  210.  
  211.   t["CodePage"] = 65001
  212.  
  213.   t["Name"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext\\SaveContextRus.lng"
  214.  
  215.   t["Locked"] = false
  216.  
  217. end
  218.  
  219. do local t=idx[17]
  220.  
  221.   t["Pos"] = 5
  222.  
  223.   t["Id"] = 0
  224.  
  225.   t["Type"] = 1
  226.  
  227.   t["Flags"] = 2
  228.  
  229.   t["Name"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts\\Bax\\SaveContext\\SaveContextRus.lng"
  230.  
  231.   t["TypeName"] = "Panels"
  232.  
  233. end
  234.  
  235. do local t=idx[18]
  236.  
  237.   t["C:\\"] = "6350b868-1ebd-48bd-8a28-6db71119698d"
  238.  
  239.   t["G:\\"] = "4359bf1a-a0a3-11eb-8f45-2c4d549a14e5"
  240.  
  241.   t["D:\\"] = "d78c0e01-0000-0000-0000-100000000000"
  242.  
  243. end
  244.  
  245. do local t=idx[19]
  246.  
  247.   t["Path"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\modules\\BAX"
  248.  
  249.   t["Left"] = true
  250.  
  251.   t["Filter"] = idx[20]
  252.  
  253.   t["PanelDirectory"] = idx[23]
  254.  
  255.   t["Info"] = idx[24]
  256.  
  257.   t["Current"] = "FileFilterTools.lua"
  258.  
  259.   t["Path0"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\modules\\BAX"
  260.  
  261.   t["HostFile"] = ""
  262.  
  263.   t["Plugin"] = false
  264.  
  265. end
  266.  
  267. do local t=idx[20]
  268.  
  269.   t["Named"] = idx[21]
  270.  
  271.   t["Ext"] = idx[22]
  272.  
  273. end
  274.  
  275. do local t=idx[23]
  276.  
  277.   t["File"] = ""
  278.  
  279.   t["Param"] = ""
  280.  
  281.   t["Name"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\modules\\BAX"
  282.  
  283.   t["PluginId"] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  284.  
  285. end
  286.  
  287. do local t=idx[24]
  288.  
  289.   t["ViewMode"] = 2
  290.  
  291.   t["SortMode"] = 2
  292.  
  293.   t["PanelType"] = 0
  294.  
  295.   t["PanelRect"] = idx[25]
  296.  
  297.   t["TopPanelItem"] = 1
  298.  
  299.   t["ItemsNumber"] = 26
  300.  
  301.   t["OwnerGuid"] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  302.  
  303.   t["CurrentItem"] = 13
  304.  
  305.   t["Flags"] = 4523
  306.  
  307.   t["SelectedItemsNumber"] = 1
  308.  
  309. end
  310.  
  311. do local t=idx[25]
  312.  
  313.   t["right"] = 73
  314.  
  315.   t["left"] = 0
  316.  
  317.   t["bottom"] = 31
  318.  
  319.   t["top"] = 0
  320.  
  321. end
  322.  
  323. do local t=idx[26]
  324.  
  325.   t["LOGONSERVER"] = "\\\\DESKTOP-23MLUVP"
  326.  
  327.   t["CONEMUBACKHWND"] = "0x0005025E"
  328.  
  329.   t["LUA"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile\\Macros\\scripts"
  330.  
  331.   t["SYSTEMDRIVE"] = "C:"
  332.  
  333.   t["COMSPEC"] = "C:\\WINDOWS\\system32\\cmd.exe"
  334.  
  335.   t["ALLUSERSPROFILE"] = "C:\\ProgramData"
  336.  
  337.   t["LOCALAPPDATA"] = "C:\\Users\\PC\\AppData\\Local"
  338.  
  339.   t["CONEMUWORKDRIVE"] = "C:"
  340.  
  341.   t["SYSTEMROOT"] = "C:\\WINDOWS"
  342.  
  343.   t["PROGRAMFILES"] = "C:\\Program Files"
  344.  
  345.   t["UPX"] = "--best"
  346.  
  347.   t["CLASSPATH"] = "C:\\Program Files (x86)\\Borland\\InterBase\\InterClient\\interclient.jar;C:\\Program Files (x86)\\Borland\\InterBase\\InterClient\\interclient.jar;C:\\Program Files (x86)\\Borland\\InterBase\\InterClient\\interclient.jar"
  348.  
  349.   t["CONEMUPID"] = "5976"
  350.  
  351.   t["CONEMUPALETTE"] = "<Default Windows scheme>"
  352.  
  353.   t["ONEDRIVE"] = "C:\\Users\\PC\\OneDrive"
  354.  
  355.   t["FARHOME"] = "C:\\Program Files\\Far Manager"
  356.  
  357.   t["CONEMUBUILD"] = "210314"
  358.  
  359.   t["FARLOCALPROFILE"] = "C:\\Users\\PC\\AppData\\Local\\Far Manager\\Profile"
  360.  
  361.   t["CONEMUDRAWHWND"] = "0x000701BE"
  362.  
  363.   t["OS"] = "Windows_NT"
  364.  
  365.   t["TMP"] = "C:\\TEMP"
  366.  
  367.   t["PROCESSOR_REVISION"] = "9e09"
  368.  
  369.   t["CONEMUWORKDIR"] = "C:\\Users\\PC"
  370.  
  371.   t["WINDIR"] = "C:\\WINDOWS"
  372.  
  373.   t["FARLANG"] = "English"
  374.  
  375.   t["CONEMUSERVERPID"] = "116"
  376.  
  377.   t["COMPUTERNAME"] = "DESKTOP-23MLUVP"
  378.  
  379.   t["CONEMUHOOKS"] = "Enabled"
  380.  
  381.   t["BRO"] = "C:\\TOOLS\\"
  382.  
  383.   t["PATH"] = "C:\\Program Files\\Far Manager\\ConEmu\\Scripts;C:\\Program Files\\Far Manager;C:\\Program Files\\Far Manager\\ConEmu;D:\\Program Files (x86)\\VMware\\VMware Player\\bin\\;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;D:\\Program Files (x86)\\CodeGear\\RAD Studio\\5.0\\bin;C:\\Users\\Public\\Documents\\RAD Studio\\5.0\\Bpl;C:\\Program Files (x86)\\PC Connectivity Solution\\;C:\\TOOLS;C:\\TOOLS\\elinks;C:\\Windows\\SysWOW64\\;D:\\Delphi7\\Bin;D:\\Delphi7\\Projects\\Bpl\\;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\7-Zip;D:\\Subst\\F\\harbour\\bin;D:\\Subst\\F\\mingw32\\bin\\;C:\\Program Files\\dotnet\\;C:\\Program Files (x86)\\WinMerge;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\TortoiseGit\\bin;C:\\TOOLS\\Hiew866;D:\\Program Files (x86)\\FastCopy;D:\\Program Files\\Everything;D:\\Program Files (x86)\\Universal Extractor;D:\\Program Files (x86)\\Universal Extractor\\bin;D:\\Go\\bin;C:\\Program Files\\TortoiseSVN\\bin;D:\\Program Files\\Git\\cmd;C:\\Users\\PC\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files (x86)\\CDBurnerXP;D:\\Program Files\\Mercurial;D:\\Program Files\\WinHTTrack;C:\\Users\\PC\\go\\bin;C:\\Users\\PC\\.dotnet\\tools;D:\\Microsoft VS Code\\bin;C:\\Users\\PC\\AppData\\Local\\GitHubDesktop\\bin"
  384.  
  385.   t["ANSICON"] = "148x34 (148x34)"
  386.  
  387.   t["PROGRAMDATA"] = "C:\\ProgramData"
  388.  
  389.   t["USERPROFILE"] = "C:\\Users\\PC"
  390.  
  391.   t["HOMEPATH"] = "\\Users\\PC"
  392.  
  393.   t["CONEMUCFGDIR"] = "C:\\Program Files\\Far Manager"
  394.  
  395.   t["COMMONPROGRAMFILES(X86)"] = "C:\\Program Files (x86)\\Common Files"
  396.  
  397.   t["EMAIL"] = "D:\\Mail"
  398.  
  399.   t["PUBLIC"] = "C:\\Users\\Public"
  400.  
  401.   t["BDSCOMMONDIR"] = "C:\\Users\\Public\\Documents\\RAD Studio\\5.0"
  402.  
  403.   t["ANSICON_DEF"] = "7"
  404.  
  405.   t["PROGRAMFILES(X86)"] = "C:\\Program Files (x86)"
  406.  
  407.   t["USERDOMAIN_ROAMINGPROFILE"] = "DESKTOP-23MLUVP"
  408.  
  409.   t["TOOLS_PATH"] = "C:\\TOOLS"
  410.  
  411.   t["CONEMUDIR"] = "C:\\Program Files\\Far Manager"
  412.  
  413.   t["GOPATH"] = "C:\\Users\\PC\\go"
  414.  
  415.   t["COMMONPROGRAMFILES"] = "C:\\Program Files\\Common Files"
  416.  
  417.   t["PSMODULEPATH"] = "C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules"
  418.  
  419.   t["PROCESSOR_IDENTIFIER"] = "Intel64 Family 6 Model 158 Stepping 9, GenuineIntel"
  420.  
  421.   t["CONEMUHWND"] = "0x000807A8"
  422.  
  423.   t["SESSIONNAME"] = "Console"
  424.  
  425.   t["CONEMUBASEDIRSHORT"] = "C:\\PROGRA~1\\FARMAN~1\\ConEmu"
  426.  
  427.   t["FARPROFILE"] = "C:\\Users\\PC\\AppData\\Roaming\\Far Manager\\Profile"
  428.  
  429.   t["APPDATA"] = "C:\\Users\\PC\\AppData\\Roaming"
  430.  
  431.   t["ONEDRIVECONSUMER"] = "C:\\Users\\PC\\OneDrive"
  432.  
  433.   t["NUMBER_OF_PROCESSORS"] = "4"
  434.  
  435.   t["USERNAME"] = "PC"
  436.  
  437.   t["CONEMUANSI"] = "ON"
  438.  
  439.   t["PROCESSOR_LEVEL"] = "6"
  440.  
  441.   t["USERDOMAIN"] = "DESKTOP-23MLUVP"
  442.  
  443.   t["HOMEDRIVE"] = "C:"
  444.  
  445.   t["VBROKERDIR"] = "c:\\program files (x86)\\visibroker"
  446.  
  447.   t["PROGRAMW6432"] = "C:\\Program Files"
  448.  
  449.   t["PROCESSOR_ARCHITECTURE"] = "AMD64"
  450.  
  451.   t["CONEMUBASEDIR"] = "C:\\Program Files\\Far Manager\\ConEmu"
  452.  
  453.   t["CONEMUTASK"] = "{Far Manager::Far}"
  454.  
  455.   t["CONEMUDRIVE"] = "C:"
  456.  
  457.   t["TEMP"] = "C:\\TEMP"
  458.  
  459.   t["COMMONPROGRAMW6432"] = "C:\\Program Files\\Common Files"
  460.  
  461.   t["PATHEXT"] = ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
  462.  
  463.   t["DRIVERDATA"] = "C:\\Windows\\System32\\Drivers\\DriverData"
  464.  
  465. end
  466.  
  467. return idx[1]
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

John Doe, спасибо. Значит, для 16-байтовых строк вывожу всегда и исходную строку, и преобразованную функцией win.Uuid, а для редактирования ставлю чек-бокс «это - не гуид», и если юзер его включил - вывожу в поле ввода исходную строку и запоминаю без преобразования.
Да!
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

citRiks wrote: Sat 24 Apr, 2021 07:57 Я думаю можно оценивать рандомность этих 16 байтов.
или это можно назвать "энтропией", наверное.
Думал utf8.utf8valid(…) - как раз хорошо подошло бы в качестве меры "энтропии". Но John Doe дал хороший совет.
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by John Doe »

А что ваш модуль предоставляет дополнительно (помимо того, что умеет luaexplorer)?
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

John Doe wrote: Sat 24 Apr, 2021 08:58 А что ваш модуль предоставляет дополнительно (помимо того, что умеет luaexplorer)?
Пока - только две вещи: редактирование (по месту - т.е. без добавления/удаления полей и не изменяя типа данных в поле) и в случае циклической ссылки - переход на первое вхождение под-таблицы.
На самом деле представление таблицы в виде дерева мне просто нравится. Чисто эстетически. К тому же работают стандартные для DI_LIST возможности - фильтр, например. Ну и возможность распахивать/сворачивать узлы - тоже мне нравится.
По сути он призван в моём скрипте заменить как раз Ваш le. Просто анализировать таблицу, не имея её перед глазами, как оказалось, не очень удобно (мне, во всяком случае. У меня очень плохая память, приходится брать ручку и рисовать таблицу, заходя во вложенные, выходя обратно и переходя к следующей).
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

John Doe, P/S.
Там ещё есть переход на sibling-и - на узлы того же уровня вложенности, вложенные в ту же родительскую таблицу (последнее условие забыл проверять).
User avatar
John Doe
Бюрократ
Posts: 13847
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by John Doe »

buniak_a_h wrote: Sat 24 Apr, 2021 09:26 На самом деле представление таблицы в виде дерева мне просто нравится. Чисто эстетически
Тогда конечно. Скриншот покажите?
buniak_a_h wrote: Sat 24 Apr, 2021 09:33 Там ещё есть переход на sibling-и
Да, может быть удобно для просмотра массива таблиц.
(Но легко и намакростить)
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

John Doe wrote: Sat 24 Apr, 2021 09:47 Скриншот покажите?
User avatar
buniak_a_h
Posts: 4259
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Как отличить просто строку от GUID-а "во внутреннем представлении"

Post by buniak_a_h »

John Doe wrote: Sat 24 Apr, 2021 09:47 легко и намакростить
Так я и намакросил. Часа четыре потратил.
Post Reply

Return to “Нужна помощь”