1

Тема: AHK: Скрипт для быстрого тестиров. кода, выложенного на Web-странице

Скрипт для быстрого тестирования скриптового (или аналогичного) кода, выложенного на Web-страницах, например, на страницах форумов.

Скрипт помогает автоматизировать следующие действия: скопировать выделенный в браузере код в буфер, создать временный текстовый файл на диске с нужным расширением, открыть файл в выбранном текстовом редакторе, вставить туда код, а при необходимости ещё открыть выбранный файловый менеджер и/или командный интерпретатор на каталоге с этим временным файлом. Настроен для работы только в браузерах (FF, IE, Опера).

Использование: выделить в браузере текстовый фрагмент, нажать Win+T или Win+Средняя кнопка мыши, выбрать расширение, затем, при необходимости, выбрать кодировку.

Все настройки осуществляются через testing.ini, который должен лежать рядом со скриптом. При первом запуске testing.ini будет автоматически создан, если его нет. Структура testing.ini - ниже.

Секция [general] обязательна:
    * параметр "folder" должен присутствовать обязательно и содержать путь к каталогу временных файлов для создания временных файлов скриптов;
    * параметр "extensions" должен присутствовать обязательно и содержать все нужные расширения, разделённые запятыми; для каждого расширения ниже обязательно должна присутствовать одноимённая секция.

Секция [имя_расширения]:
    * параметр "editor" должен присутствовать обязательно и содержать путь к текстовому редактору, можно с дополнительными параметрами командной строки;
    * параметр "filemanager" опционален и обеспечивает запуск файлового менеджера; должен содержать путь к файловому менеджеру, можно с дополнительными параметрами командной строки;
    * параметр "cmd=True" опционален и обеспечивает запуск командного интерпретатора;
    * параметр "selectCoding=True" опционален и обеспечивает выбор кодировки ("UTF-8" или "ANSI") для создания файла; если его нет, файл создаётся в кодировке ANSI.

;======================================Секция автовыполнения=======================================

CreateINI() ; создаёт INI-файл "по умолчанию", если его нет

;======================================Хоткеи======================================================

#vk54::    ; Win+T
#MButton:: ; Win+Средняя кнопка мыши
    WinGet, hwnd, ID, A
    WinGetClass, class, A
    If(class = "MozillaUIWindowClass" or class = "IEFrame" or class = "OperaWindowClass")
        Gosub, CodeTesting
    Return

;======================================Метки=======================================================

CodeTesting:
    extension =
    ; Получаем список расширений:
    IniRead, exts, %A_ScriptDir%\testing.ini, general, extensions
    If(exts = "ERROR")
    {
        MsgBox, Неверный формат INI-файла! Не указан параметр extensions в секции general.
        ExitApp
    }
    ; Разбираем список расширений и генерируем меню:
    Loop, parse, exts, `,
    {
        Menu, SelectMenu, Add, %A_LoopField%, labelExtension
    }
    Menu, SelectMenu, Show ; отображаем меню со списком расширений
    If(extension = "") ; если ничего не выбрано, завершаем работу
    {
        Return
    }
    
    WinActivate, ahk_id%hwnd% ; активизируем окно браузера
    ClipSaved := ClipboardAll ; сохраняем содержимое буфера обмена
    Clipboard := ; очищаем буфер обмена
    SendInput, ^{vk43} ; посылаем Ctrl+C (копировать выделенное в буфер)
    ClipWait, 1 ; ждём появления данных в буфере 1 секунду
    ; Проверяем необходимость выбора кодировки:
    IniRead, selCod, %A_ScriptDir%\testing.ini, %extension%, selectCoding
    codingSel = ANSI ; кодировка по умолчанию
    If(selCod = "True")
    {
        coding =
        Menu, SelectCoding, Add, UTF-8, labelCoding
        Menu, SelectCoding, Add, ANSI, labelCoding
        Menu, SelectCoding, Show ; выбор кодировки ("UTF-8" или "ANSI")
        If(coding = "") ; если ничего не выбрано, завершаем работу
        {
            Return
        }
        codingSel := coding
    }
    CodeForTesting =
    If(codingSel = "ANSI")
    {
        CodeForTesting := Clipboard
    }
    Else ; UTF-8
    {
        Transform, CodeForTesting, Unicode
    }
    Clipboard := ClipSaved ; восстановление содержимого буфера
    If(CodeForTesting = "")
    {
        MsgBox, Не обнаружен код для тестирования! Возможно, при запуске не было ничего выделено.
        Return
    }
    
    ; Получаем папку для расположения скриптов:
    IniRead, fold, %A_ScriptDir%\testing.ini, general, folder
    If(fold = "ERROR")
    {
        MsgBox, Неверный формат INI-файла! Не указан параметр folder в секции general.
        ExitApp
    }
    FileCreateDir, %fold% ; создаём папку, если её нет
    FileDelete, %fold%\test.%extension% ; удаляем файл, если он есть
    FileAppend, %CodeForTesting%, %fold%\test.%extension% ; записываем файл
    
    ; Получаем путь к текстовому редактору:
    IniRead, edit, %A_ScriptDir%\testing.ini, %extension%, editor
    If(edit = "ERROR")
    {
        MsgBox, Неверный формат INI-файла! Не указан параметр editor в секции %extension%.
        ExitApp
    }
    Run, %edit% "%fold%\test.%extension%" ; запускаем текстовый редактор
    
    ; Получаем путь к файловому менеджеру:
    IniRead, fileman, %A_ScriptDir%\testing.ini, %extension%, filemanager
    If(fileman != "ERROR")
    {
        Run, %fileman% "%fold%\test.%extension%" ; запускаем файловый менеджер
    }
    
    ; Проверяем необходимость запуска cmd.exe:
    IniRead, commd, %A_ScriptDir%\testing.ini, %extension%, cmd
    If(commd = "True")
    {
        Run, %comspec% /k cd %fold% ; запускаем cmd.exe
    }
    
    Return

labelExtension:
    extension = %A_ThisMenuItem%
    Return

labelCoding:
    coding = %A_ThisMenuItem%
    Return

;======================================Функции=====================================================

; Создаёт INI-файл "по умолчанию", если его нет.
CreateINI()
{
    IfNotExist, %A_ScriptDir%\testing.ini
    {
        FileAppend,
        (
[general]
folder=C:\Temp\Testing
extensions=ahk,bat,cmd,css,html,hta,js,mf,py,pyw,vbs,wsf

[ahk]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[bat]
editor="%windir%\notepad.exe"
cmd=True

[cmd]
editor="%windir%\notepad.exe"
cmd=True

[css]
editor="%windir%\notepad.exe"

[html]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[hta]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[js]
editor="%windir%\notepad.exe"
cmd=True
filemanager=explorer /select,

[py]
editor="%windir%\notepad.exe"
cmd=True
selectCoding=True

[pyw]
editor="%windir%\notepad.exe"
filemanager=explorer /select,
selectCoding=True

[mf]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[vbs]
editor="%windir%\notepad.exe"
cmd=True
filemanager=explorer /select,

[wsf]
editor="%windir%\notepad.exe"
cmd=True
filemanager=explorer /select,

), %A_ScriptDir%\testing.ini
    }
}
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: AHK: Скрипт для быстрого тестиров. кода, выложенного на Web-странице

Добавлена поддержка кодировки OEM при "selectCoding=True" и возможность использовать переменные окружения в INI файле (например, %windir%).

;======================================Секция автовыполнения=======================================

CreateINI() ; создаёт INI-файл "по умолчанию", если его нет

;======================================Хоткеи======================================================

#vk54::    ; Win+T
#MButton:: ; Win+Средняя кнопка мыши
    WinGet, hwnd, ID, A
    WinGetClass, class, A
    If(class = "MozillaUIWindowClass" or class = "IEFrame" or class = "OperaWindowClass")
        Gosub, CodeTesting
    Return

;======================================Метки=======================================================

CodeTesting:
    extension =
    ; Получаем список расширений:
    IniRead, exts, %A_ScriptDir%\testing.ini, general, extensions
    If(exts = "ERROR")
    {
        MsgBox, Неверный формат INI-файла! Не указан параметр extensions в секции general.
        ExitApp
    }
    ; Разбираем список расширений и генерируем меню:
    Loop, parse, exts, `,
        Menu, SelectMenu, Add, %A_LoopField%, labelExtension
    Menu, SelectMenu, Show ; отображаем меню со списком расширений
    If(extension = "") ; если ничего не выбрано, завершаем работу
        Return
    
    WinActivate, ahk_id%hwnd% ; активизируем окно браузера
    ClipSaved := ClipboardAll ; сохраняем содержимое буфера обмена
    Clipboard := ; очищаем буфер обмена
    SendInput, ^{vk43} ; посылаем Ctrl+C (копировать выделенное в буфер)
    ClipWait, 1 ; ждём появления данных в буфере 1 секунду
    ; Проверяем необходимость выбора кодировки:
    IniRead, selCod, %A_ScriptDir%\testing.ini, %extension%, selectCoding
    codingSel = ANSI ; кодировка по умолчанию
    If(selCod = "True")
    {
        coding =
        Menu, SelectCoding, Add, UTF-8, labelCoding
        Menu, SelectCoding, Add, ANSI, labelCoding
        Menu, SelectCoding, Add, OEM, labelCoding
        Menu, SelectCoding, Show ; выбор кодировки ("UTF-8" или "ANSI")
        If(coding = "") ; если ничего не выбрано, завершаем работу
            Return
        codingSel := coding
    }
    CodeForTesting =
    If(codingSel = "OEM")
        CodeForTesting := Ansi2Oem(Clipboard)
    Else If(codingSel = "ANSI")
        CodeForTesting := Clipboard
    Else ; UTF-8
        Transform, CodeForTesting, Unicode
    Clipboard := ClipSaved ; восстановление содержимого буфера
    If(CodeForTesting = "")
    {
        MsgBox, Не обнаружен код для тестирования! Возможно, при запуске не было ничего выделено.
        Return
    }
    
    ; Получаем папку для расположения скриптов:
    IniRead, fold, %A_ScriptDir%\testing.ini, general, folder
    fold := ExpandEnv(fold)
    If(fold = "ERROR")
    {
        MsgBox, Неверный формат INI-файла! Не указан параметр folder в секции general.
        ExitApp
    }
    FileCreateDir, %fold% ; создаём папку, если её нет
    FileDelete, %fold%\test.%extension% ; удаляем файл, если он есть
    FileAppend, %CodeForTesting%, %fold%\test.%extension% ; записываем файл
    
    ; Получаем путь к текстовому редактору:
    IniRead, ed, %A_ScriptDir%\testing.ini, %extension%, editor
    ed := ExpandEnv(ed)
    If(ed = "ERROR")
    {
        MsgBox, Неверный формат INI-файла! Не указан параметр editor в секции %extension%.
        ExitApp
    }
    Run, %ed% "%fold%\test.%extension%" ; запускаем текстовый редактор
    
    ; Получаем путь к файловому менеджеру:
    IniRead, fileman, %A_ScriptDir%\testing.ini, %extension%, filemanager
    fileman := ExpandEnv(fileman)
    If(fileman != "ERROR")
        Run, %fileman% "%fold%\test.%extension%" ; запускаем файловый менеджер
    
    ; Проверяем необходимость запуска cmd.exe:
    IniRead, commd, %A_ScriptDir%\testing.ini, %extension%, cmd
    If(commd = "True")
        Run, %comspec% /k cd %fold% ; запускаем cmd.exe
    
    Return

labelExtension:
    extension = %A_ThisMenuItem%
    Return

labelCoding:
    coding = %A_ThisMenuItem%
    Return

;======================================Функции=====================================================

; Создаёт INI-файл "по умолчанию", если его нет.
CreateINI()
{
    IfNotExist, %A_ScriptDir%\testing.ini
    {
        FileAppend,
        (
[general]
folder=C:\Temp\Testing
extensions=ahk,bat,cmd,css,html,hta,js,mf,py,pyw,vbs,wsf

[ahk]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[bat]
editor="%windir%\notepad.exe"
cmd=True

[cmd]
editor="%windir%\notepad.exe"
cmd=True

[css]
editor="%windir%\notepad.exe"

[html]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[hta]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[js]
editor="%windir%\notepad.exe"
cmd=True
filemanager=explorer /select,

[py]
editor="%windir%\notepad.exe"
cmd=True
selectCoding=True

[pyw]
editor="%windir%\notepad.exe"
filemanager=explorer /select,
selectCoding=True

[mf]
editor="%windir%\notepad.exe"
filemanager=explorer /select,

[vbs]
editor="%windir%\notepad.exe"
cmd=True
filemanager=explorer /select,

[wsf]
editor="%windir%\notepad.exe"
cmd=True
filemanager=explorer /select,

), %A_ScriptDir%\testing.ini
    }
}

; Разворачивает переменные среды в переданной строке.
; Незакрытые "%" не проверяются.
ExpandEnv(str)
{
    res := ""
    Loop, parse, str, `%
    {
        EnvGet, env, %A_LoopField%
        If(env = "")
            res := res . A_LoopField
        Else
            res := res . env
    }
    Return, res
}

; Преобразует строку ANSI к OEM.
Ansi2Oem(sString)
{
    Ansi2Unicode(sString, wString, 0)
    Unicode2Ansi(wString, zString, 1)
    Return, zString
}

Ansi2Unicode(ByRef sString, ByRef wString, CP = 0)
{
    nSize := DllCall("MultiByteToWideChar"
        , "Uint", CP
        , "Uint", 0
        , "Uint", &sString
        , "int",  -1
        , "Uint", 0
        , "int",  0)
    VarSetCapacity(wString, nSize * 2)
    DllCall("MultiByteToWideChar"
        , "Uint", CP
        , "Uint", 0
        , "Uint", &sString
        , "int",  -1
        , "Uint", &wString
        , "int",  nSize)
}

Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
    nSize := DllCall("WideCharToMultiByte"
        , "Uint", CP
        , "Uint", 0
        , "Uint", &wString
        , "int",  -1
        , "Uint", 0
        , "int",  0
        , "Uint", 0
        , "Uint", 0)
    VarSetCapacity(sString, nSize)
    DllCall("WideCharToMultiByte"
        , "Uint", CP
        , "Uint", 0
        , "Uint", &wString
        , "int",  -1
        , "str",  sString
        , "int",  nSize
        , "Uint", 0
        , "Uint", 0)
}

Во вложении поста - откомпилированная версия скрипта (standalone executable, не требует инсталляции).

Post's attachments

CodeTestingOnWeb.zip 195.36 kb, 577 downloads since 2008-12-16 

You don't have the permssions to download the attachments of this post.
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.