гиперссылки

Russian main discussion
  • Author
  • Message
Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KeepGoing
Можно взять CaretSelect.js, положить его в \Scripts\Include, а в \Scripts\ создать файл, к примеру

Code: Select all

if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();

var URL = getLinkCaret();
if (URL) {
	if (URL.charAt(0) != "\\")	{	//не сетевой путь в файловой системе
		if (URL.indexOf(":\\") == -1 && URL.indexOf(":/") == -1)
			URL = "http://" + URL;
	}
	
	var WshShell = new ActiveXObject("WScript.Shell");
	WshShell.Exec('rundll32.exe shell32, ShellExec_RunDLL "' + URL + '"');
}

Открывает почти как Вы хотите. Почти - если в браузере была текущая вкладка, то при открытии ссылка откроется в фоне, а фокус останется на текущей вкладке (у меня в Опере так).

Можно было бы использовать функцию getLinkCaret() + скрипт openFileIn.js Infocatcher'а, но он к сожалению поддерживает только передачу параметров в виде аргументов.

Instructor
Очень не хватает в AEGI_ поиска начала и конца ссылки, находящейся под курсором.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:А меню вызывать с клавиатуры.
А как его вызвать с клавиатуры? Перепробовал все комбинации ContextMenu::Show, либо вылетает главное меню, либо требует обязательного указания подменю, находящегося ContextMenu::Show, меню же целиком (в данном случае меню ссылок) не выводит.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh
Да стандартно, или кнопкой специальной, или Shift+F10.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher
"стандартно, или кнопкой специальной" на подходит по условиям задачи, надо работать чисто с клавиатуры.
Жму по Shift+F10, меню вылетает, чтобы выбрать нужный пункт по комбинации клавиш надо жать Alt+0, но уже при нажатии Alt меню сбрасывается (старая баго-фича, о которой давно писали и просили, чтобы меню не сбрасывалось).

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh
Так это у всех меню так.
Alt+Ф => Файл
О => Открыть

При открытом меню нажимать Alt уже не надо.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Магическая кнопка между правой клавишей Win и правым Ctrl ;)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher, Fr0sT
Работает. Прикольно :)

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

KeepGoing

Code: Select all

if (SelectLinkUnderCaret(AkelPad.GetEditWnd()))
  AkelPad.Exec('rundll32.exe shell32,ShellExec_RunDLL "' + AkelPad.GetSelText() + '"');

function SelectLinkUnderCaret(hWndEdit)
{
  var lpSel;
  var lpCaret;
  var bSelected=false;

  if (lpCaret=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
    if (lpSel=AkelPad.MemAlloc(_X64?56:28 /*sizeof(AESELECTION)*/))
    {
      if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpSel))
      {
        AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel);
        bSelected=true;
      }
      AkelPad.MemFree(lpSel);
    }
    AkelPad.MemFree(lpCaret);
  }
  return bSelected;
}

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Instructor
Здорово!
А можно ли ещё как-то не выделяя ссылку? Т.е. получить границы, текст ссылки, а затем открыть?

Offline
Posts: 37
Joined: Thu Sep 15, 2011 6:51 am

Post by KeepGoing »

Instructor,
у меня OpenLinkUnderCaret.js, повешенный на хоткей, только выделяет ссылку, но в браузере ссылка не открывается

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

VladSh

Code: Select all

var sLink=GetLinkUnderCaret(AkelPad.GetEditWnd());
if (sLink)
  AkelPad.Exec('rundll32.exe shell32,ShellExec_RunDLL "' + sLink + '"');

function GetLinkUnderCaret(hWndEdit)
{
  var lpSel;
  var lpCaret;
  var nLinkStart;
  var nLinkEnd;
  var sLink;

  if (lpCaret=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
    if (lpSel=AkelPad.MemAlloc(_X64?48:24 /*sizeof(AESELECTION)*/))
    {
      if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpSel))
      {
        nLinkStart=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpSel);
        nLinkEnd=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpSel + (_X64?24:12));
        sLink=AkelPad.GetTextRange(nLinkStart, nLinkEnd);
      }
      AkelPad.MemFree(lpSel);
    }
    AkelPad.MemFree(lpCaret);
  }
  return sLink;
}

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KDJ
Thank you! Now there is both variants.

Edited:
Here's what obtained: CaretSelect.js.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

KeepGoing wrote:Instructor,
у меня OpenLinkUnderCaret.js, повешенный на хоткей, только выделяет ссылку, но в браузере ссылка не открывается
А так?

Code: Select all

var oSys=AkelPad.SystemFunction();
var hWndEdit=AkelPad.GetEditWnd();
var crUrl;

if (crUrl=GetLinkUnderCaret(hWndEdit))
  oSys.Call("shell32::ShellExecute" + _TCHAR, hWndEdit, "open", AkelPad.GetTextRange(crUrl.cpMin, crUrl.cpMax), 0, 0, 1 /*SW_SHOWNORMAL*/);

function GetLinkUnderCaret(hWndEdit)
{
  var lpRange;
  var lpCaret;
  var crUrl=[];
  var bResult=false;

  if (lpCaret=AkelPad.MemAlloc(_X64?24:12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 5 /*AEGI_CARETCHAR*/, lpCaret);
    if (lpRange=AkelPad.MemAlloc(_X64?48:24 /*sizeof(AECHARRANGE)*/))
    {
      if (AkelPad.SendMessage(hWndEdit, 3149 /*AEM_INDEXINURL*/, lpCaret, lpRange))
      {
        crUrl.cpMin=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpRange);
        crUrl.cpMax=AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpRange + (_X64?24:12) /*offsetof(AECHARRANGE, ciMax)*/);
        bResult=true;
      }
      AkelPad.MemFree(lpRange);
    }
    AkelPad.MemFree(lpCaret);
  }
  if (bResult)
    return crUrl;
  return 0;
}

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Instructor
Спасибо за ещё одну реализацию GetLinkUnderCaret, это как раз точно в ёлочку! 8)

Offline
Posts: 37
Joined: Thu Sep 15, 2011 6:51 am

Post by KeepGoing »

Instructor wrote: А так?
вот теперь - аккурат то, что надо! :D
Post Reply