UrlActivator — альтернатива Edit.OpenURL.lua

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

UrlActivator — альтернатива Edit.OpenURL.lua

Post by John Doe »

Паразитирует на Colorer, соответственно работает везде, где он отображает ссылки.
(Напомню, что ссылки будут подчёркнуты только в режиме TrueMod.)

Активируется двойным кликом мыши, или Shift+Enter.

Code: Select all

local F = far.Flags

local function expandEnv (str)
  return (str:gsub("%%([%w_]-)%%", win.GetEnv))
end

local function open (url)
  if not url then
    return
  elseif url:match"^http" then
    win.ShellExecute(nil,nil,url)
  elseif url:match"^mk:@MSITStore:" then
    win.ShellExecute(nil,nil,"hh",expandEnv(url))
  end
end

local function colorer (...)
  return Plugin.SyncCall("D2F36B62-A470-418D-83A3-ED7A3710E5B5", ...)
end

Macro { description="Open url (Colorer)";
  area="Editor"; key="MsLClick ShiftEnter";
  priority=60;
  id="EF30041E-6F5F-4B56-83DC-7C9529570433";
  condition=function(key)
    if bit64.band(Mouse.EventFlags, F.DOUBLE_CLICK)~=0 or not key:match"^Ms" then
      local region, scheme = colorer("Region","List")
      return region=="def:URL" or region=="markdown:LinkMark"
          or region=="markdown:LinkText" and scheme~="markdown:Link"
    end
  end;
  action=function()
    colorer("Region","Select")
    local sel = Editor.SelValue
    sel = sel:match('^%]%((.-) "') or sel
    sel = sel:match("^%]%((.-)%)") or sel
    open(sel)
  end;
}
Написал его потому что забыл про существование Addons\Macros\Edit.OpenURL.lua, но почему бы и нет.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

UrlActivator — альтернатива Edit.OpenURL.lua

Post by John Doe »

И ещё одна альтернатива, не зависящая от Colorer, т.е. будет работать и если url не подсвечивается как ссылка (например находится в строке).

Предполагается что он в том же файле, что и предыдущий, т.к. функция open у них общая.

Code: Select all

local function GetTextFromLine (str,pos,pattern)
  local last,offset,match = 0
  repeat
    offset,last,match = pattern:find(str, last+1)
    if not offset or offset>pos then
      return nil, pos
    elseif last>=pos then
      return match, offset, last
    end
  until false
end

local url_ptn = regex.new[=[(https?://[-./\w]+([?#][-.%\w&=/:#]+)?)]=]
local chm_ptn = regex.new[=[(mk:@MSITStore:[-.:%\\/\w]+)]=]
Macro { description="Open url (plain|selection)";
  area="Editor"; key="MsLClick ShiftEnter";
  id="4B0A50A1-6A71-437C-944A-320AEE6FC1D0";
  condition=function(key)
    return bit64.band(Mouse.EventFlags, F.DOUBLE_CLICK)~=0 or not key:match"^Ms"
  end;
  action=function()
    local str,pos
    if Object.Selected and Editor.CurLine==Editor.Sel(0,0) then
      str = Editor.SelValue
      pos = math.min(Editor.CurPos-Editor.Sel(0,1)+1, str:len()-1)
    else
      str,pos = Editor.Value, Editor.CurPos
    end
    local url = GetTextFromLine(str,pos,url_ptn) or GetTextFromLine(str,pos,chm_ptn)
    open(url and url:match"(.+)%.$" or url)
  end;
}
Регэксп конечно намного более простой, чем в Edit.OpenURL.lua, возможно исходя из требований практики будет модифицироваться.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

UrlActivator — альтернатива Edit.OpenURL.lua

Post by John Doe »

Кстати о регэкспах, сначала хотел найти проверенное решение, на lpeg, но посмотрел насколько оно всё громоздко, плюнул, и составил на коленке примитивный регэксп.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

UrlActivator — альтернатива Edit.OpenURL.lua

Post by Shmuel »

Интересно, в Google Translate, если URL обрамлён символами <>, то озвучка русского перевода включает в себя "меньше чем" и "больше чем". Озвучка чешского (например) перевода - OK.
Post Reply

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