Помогите написать скрипт

Russian main discussion
  • Author
  • Message
DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Skif_off,
Плагин ContextMenu в контестном меню окна редактирования предлагает подменю Отметить (Mark) с разными цветами отметки. Не оно?

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

DV
Оно, только с флагом 1 (учитывать регистр), а в качестве текста берется выделение и все. Регулярное выражение не подсунешь, как и произвольный текст.
Сделал пару кнопок на тулбаре

Code: Select all

-"Подсветить текст" Call("Coder::HighLight", 2, "#FF0000", 0, 0, 2, -1, "<strong>", -1) Icon("%a\AkelFiles\Plugs\Coder.dll", 0)
-"Подсветить текст RegExp" Call("Coder::HighLight", 2, "#FF0000", 0, 3, 2, -1, "[а-яё]\s[А-ЯЁ]", -1) Icon("%a\AkelFiles\Plugs\Coder.dll", 0)
Но не так удобно.

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

Post by KDJ »

Skif_off
Try this script:

Code: Select all

// Required to include: CreateDialog_functions.js

if ((! AkelPad.Include("CreateDialog_functions.js")) || ((! AkelPad.IsPluginRunning("Coder::HighLight")) && (AkelPad.Call("Coder::HighLight") == -1 /*UD_FAILED*/)))
  WScript.Quit();

var oSys   = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll();
var hFocus;

var IDTEXTE   = 2000;
var IDCASEB   = 2001;
var IDREGEXPB = 2002;
var IDCOLOR1S = 2003;
var IDCOLOR2S = 2004;
var IDFONTS   = 2005;
var IDCOLOR1E = 2006;
var IDCOLOR2E = 2007;
var IDFONTCB  = 2008;
var IDMARKB   = 2009;
var IDUNMARKB = 2010;
var IDCLOSEB  = 2011;
var aDlg      = [];

aDlg.Class    = sClass;
aDlg.Title    = WScript.ScriptName;
aDlg.Style    = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU;
aDlg.X        = 400;
aDlg.Y        = 200;
aDlg.W        = 250;
aDlg.H        = 208;
aDlg.Parent   = AkelPad.GetMainWnd();
aDlg.Callback = DialogCallback;
aDlg.CtlFirst = 2000;
aDlg.CtlStyle = WS_VISIBLE;
aDlg.CtlFont  = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
aDlg.SizeClt  = true;

aDlg[IDTEXTE]   = {X:  10, Y:  10, W: 230, H:  60, Class: "AkelEditW",                            Style: WS_TABSTOP | WS_BORDER | ES_MULTILINE};
aDlg[IDCASEB]   = {X:  10, Y:  80, W: 120, H:  16, Class: "BUTTON", Title: "Case sensitive",      Style: WS_TABSTOP | BS_AUTOCHECKBOX};
aDlg[IDREGEXPB] = {X:  10, Y: 100, W: 120, H:  16, Class: "BUTTON", Title: "Regular expressions", Style: WS_TABSTOP | BS_AUTOCHECKBOX};
aDlg[IDCOLOR1S] = {X:  10, Y: 125, W:  60, H:  13, Class: "STATIC", Title: "Text color:"};
aDlg[IDCOLOR2S] = {X:  80, Y: 125, W:  60, H:  13, Class: "STATIC", Title: "Background:"};
aDlg[IDFONTS]   = {X: 150, Y: 125, W:  90, H:  13, Class: "STATIC", Title: "Font style:"};
aDlg[IDCOLOR1E] = {X:  10, Y: 140, W:  60, H:  21, Class: "AkelEditW",                            Style: WS_TABSTOP | WS_BORDER};
aDlg[IDCOLOR2E] = {X:  80, Y: 140, W:  60, H:  21, Class: "AkelEditW",                            Style: WS_TABSTOP | WS_BORDER};
aDlg[IDFONTCB]  = {X: 150, Y: 140, W:  90, H: 100, Class: "COMBOBOX",                             Style: WS_TABSTOP | CBS_DROPDOWNLIST};
aDlg[IDMARKB]   = {X:  10, Y: 175, W:  70, H:  23, Class: "BUTTON", Title: "&Mark",               Style: WS_TABSTOP | BS_PUSHBUTTON};
aDlg[IDUNMARKB] = {X:  90, Y: 175, W:  70, H:  23, Class: "BUTTON", Title: "&Unmark",             Style: WS_TABSTOP | BS_PUSHBUTTON};
aDlg[IDCLOSEB]  = {X: 170, Y: 175, W:  70, H:  23, Class: "BUTTON", Title: "Close",               Style: WS_TABSTOP | BS_PUSHBUTTON};

AkelPad.WindowRegisterClass(sClass);

CreateDialogWindow(aDlg);

SendMessage(aDlg[IDTEXTE].HWND, 3242 /*AEM_SETWORDWRAP*/, 2 /*AEWW_SYMBOL*/, 0);
oSys.Call("User32::SetWindowTextW", aDlg[IDTEXTE].HWND, "Text");
SendMessage(aDlg[IDTEXTE].HWND, 0x00B1 /*EM_SETSEL*/, 0, -1);

oSys.Call("User32::SetWindowTextW", aDlg[IDCOLOR1E].HWND, "#000000");
SendMessage(aDlg[IDCOLOR1E].HWND, 0x00B1 /*EM_SETSEL*/, 0, -1);
SendMessage(aDlg[IDCOLOR1E].HWND, 8 /*WM_KILLFOCUS*/, 0, 0);

oSys.Call("User32::SetWindowTextW", aDlg[IDCOLOR2E].HWND, "#9BFF9B");
SendMessage(aDlg[IDCOLOR2E].HWND, 0x00B1 /*EM_SETSEL*/, 0, -1);
SendMessage(aDlg[IDCOLOR2E].HWND, 8 /*WM_KILLFOCUS*/, 0, 0);

SendMessage(aDlg[IDCASEB].HWND, 241 /*BM_SETCHECK*/, 1, 0);

SendMessage(aDlg[IDFONTCB].HWND, 0x143 /*CB_ADDSTRING*/, 0, "0 - ignored");
SendMessage(aDlg[IDFONTCB].HWND, 0x143 /*CB_ADDSTRING*/, 0, "1 - normal");
SendMessage(aDlg[IDFONTCB].HWND, 0x143 /*CB_ADDSTRING*/, 0, "2 - bold");
SendMessage(aDlg[IDFONTCB].HWND, 0x143 /*CB_ADDSTRING*/, 0, "3 - italic");
SendMessage(aDlg[IDFONTCB].HWND, 0x143 /*CB_ADDSTRING*/, 0, "4 - bold italic");
SendMessage(aDlg[IDFONTCB].HWND, 0x14E /*CB_SETCURSEL*/, 0, 0);

oSys.Call("User32::SetFocus", hFocus = aDlg[IDTEXTE].HWND);

AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClass);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if ((uMsg == 6 /*WM_ACTIVATE*/) && (! wParam))
    hFocus = oSys.Call("User32::GetFocus");

  else if (uMsg == 7 /*WM_SETFOCUS*/)
    oSys.Call("User32::SetFocus", hFocus);

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    var nLowParam = LoWord(wParam);

    if (nLowParam == IDMARKB)
      Mark();

    else if (nLowParam == IDUNMARKB)
      AkelPad.Call("Coder::HighLight", 3, 0);

    else if ((nLowParam == IDCLOSEB) || (nLowParam == 2 /*IDCANCEL*/))
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
    oSys.Call("User32::DestroyWindow", hWnd);

  else if (uMsg == 2 /*WM_DESTROY*/)
    oSys.Call("User32::PostQuitMessage", 0);

  return 0;
}

function LoWord(nDWORD)
{
  return nDWORD & 0xFFFF;
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::SendMessageW", hWnd, uMsg, wParam, lParam);
}

function PostMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam);
}

function MessageBox(sText)
{
  AkelPad.MessageBox(aDlg.HWND, sText, WScript.ScriptName, 0x30 /*MB_ICONWARNING*/);
}

function GetTextAE(hWnd)
{
  AkelPad.SetEditWnd(hWnd);
  var sText = AkelPad.GetTextRange(0, -1);
  AkelPad.SetEditWnd(0);
  return sText;
}

function Mark()
{
  var sText      = GetTextAE(aDlg[IDTEXTE].HWND);
  var sTextColor = GetTextAE(aDlg[IDCOLOR1E].HWND) || "0";
  var sBackColor = GetTextAE(aDlg[IDCOLOR2E].HWND) || "0";
  var nFlags     = SendMessage(aDlg[IDCASEB].HWND, 240 /*BM_GETCHECK*/, 0, 0) | 2 * SendMessage(aDlg[IDREGEXPB].HWND, 240 /*BM_GETCHECK*/, 0, 0);
  var nFontStyle = SendMessage(aDlg[IDFONTCB].HWND, 0x147 /*CB_GETCURSEL*/, 0, 0);

  if (! sText)
  {
    MessageBox("No text to mark.");
    oSys.Call("User32::SetFocus", aDlg[IDTEXTE].HWND);
    return;
  }

  if ((sTextColor != "0") && (! /^#[\da-f]{6}$/i.test(sTextColor)))
  {
    MessageBox("Incorrect color code.");
    oSys.Call("User32::SetFocus", aDlg[IDCOLOR1E].HWND);
    return;
  }

  if ((sBackColor != "0") && (! /^#[\da-f]{6}$/i.test(sBackColor)))
  {
    MessageBox("Incorrect color code.");
    oSys.Call("User32::SetFocus", aDlg[IDCOLOR2E].HWND);
    return;
  }

  AkelPad.Call("Coder::HighLight", 2, sTextColor, sBackColor, nFlags, nFontStyle, -1, sText);
}

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

KDJ
Big thanks, works fine.

Offline
Posts: 366
Joined: Mon Jan 10, 2011 5:28 pm
Contact:

Post by Lenchik »

Помогите с шаблоном-хаготовкой скрипта для отправки POST запросов на сайты и получения их ответа.

Пример - http://www.typograf.ru/webservice/about/
На PHP я такое повторял, а вот как сделать это в рамках акельпада не знаю.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Как аякс запросы в ИЕ отправяются вкурсе? Ну вот именно так и тут. См. скрипты translator.js measuresConverter.js там успешно ведут диалоги с гугл-апи.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

А есть ли какая-то вспомогательная функция которая ищет парные теги (в HTML-документе) и которую можно использовать при создании скрипта? Вот, при работе плагина coder ведь используется какой-то черный ящик :wink:, который отмечает парные теги цветом.

Чего бы мне хотелось от скрипта - если курсор стоит непосредственно на теге (открывающий или закрывающий или даже одиночный, как <img> или <input> - неважно) по горячей клавише его удалять. Регулярки тут видимо не помогут...

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Cuprum
1. Посмотрите как это делается в скрипте AutoTag.js Впрочем собственно задача элементарна на столько что делается в лоб бех подглядывания куда-либо ещё.
2. Так-же если есть желание можете попробовать разобраться в zen_coding адаптации к АР. Оно какраз для редактирования html и сделано.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Cuprum wrote:...если курсор стоит непосредственно на теге ... по горячей клавише его удалять...
А вы с уже имеющимися хоткеями CodeFold-а ознакомились? Иль поставлена задача - "чтоб скриптом, никак иначе"?

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

opk44
Буду рад, если подскажите сочетание. Но, по-моему, специальной комбинации, заточенного под мою задачу, нет.

Добавлено
Имелось в виду удалять не тег, а элемент в целом, т.е. открывающий и закрывающий тег. Тут, видимо, только скриптом.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Cuprum wrote:Имелось в виду удалять не тег, а элемент в целом, т.е. открывающий и закрывающий тег. Тут, видимо, только скриптом.
А вот теперь стало непонятнее. Нужно ли удалять то, что находится между открывающим и закрывающим тегами?
Возможно я путаюсь в терминологии, но если требуется удалить открывающий тэг, закрывающий тэг и все что между ними, то нажатие [CTRL+\] выделяет все вышеозначенное, а выделенное удаляется элементарно DELETE-ом.
У меня полноразмерная (не ноутбучная) клавиатура, так что там эти кнопки рядом и проблем не возникает. Выделение и удаление конечно можно совместить в скрипте/макросе в "одну операцию", навесив на свой хоткей:

Code: Select all

var WshShell=new ActiveXObject("WScript.shell");
WshShell.SendKeys("^\{DEL}");
Но! Выигрыш минимален, да и работать все равно будет только при включенном CodeFold-е. Кроме того придется помнить еще одно не стандартное сочетание.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

opk44
Нет, то что внутри, надо оставить. Если есть такая конструкция

Code: Select all

<div class="block"><p>Тут текст</p></div>
то когда курсор установлен, к примеру, непосредственно на </p>, то по горячей клавише удаляются только теги. В итоге должно остаться

Code: Select all

<div class="block">Тут текст</div>
Буду по рекомендации FeyFre смотреть как сделано в других скриптах.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

С тегами пока повременим, сначала надо на кошках потренироваться.

Вот как вставить из скрипта новую строку в положение каретки с сохранением отступов слева, если в настройках редактора уже стоит птичка "сохранять отступы слева"?
При простом вызове

Code: Select all

AkelPad.ReplaceSel("\r\n");
отступы не сохранятся.
Пробовал еще команду 4196, но она как раз смотрит, включено ли сохранение отступов в настройках, если да, то она отступов не сохраняет...

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Cuprum
1. Можно просто Enter "нажать":

Code: Select all

var WshShell=new ActiveXObject("WScript.shell");
WshShell.SendKeys("{ENTER}");
2. Использовать "сандвич" из команд 4254/4196/4254

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

opk44
Спасибо!
Post Reply