Как я могу получить текстовое значение textarea с помощью autohotkey? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь отформатировать свой код Java с помощью https://www.tutorialspoint.com/online_java_formatter.htm. Но у меня проблема с получением текста из текстовой области. Я пытаюсь получить текст из следующей текстовой области.

<textarea class="ace_text-input" style="width: 6.59px; height: 14.05px; right: 428.4px; bottom: 511.79px; opacity: 0;" spellcheck="false" wrap="off"></textarea>

Код автоотключения:

;code beautifier java
^+b::
Send ^c
formatter := "https://www.tutorialspoint.com/online_java_formatter.htm"
(pwb2 := ComObjCreate("InternetExplorer.Application")).Visible:=True
pwb2.navigate(formatter)
while pwb2.busy
    sleep 15

pwb2.document.getElementsByTagName("textarea")[0].value=Clipboard
pwb2.document.getElementById("beautify").Click()
sleep 5000
Clipboard := pwb2.document.getElementsByTagName("textarea")[1].innerHTML
Send, ^v
pwb2.quit()
Return

1 Ответ

0 голосов
/ 30 апреля 2018

Проблема в том, что веб-сайт, который вы используете для форматирования кода, использует не <textarea>, а этот редактор кода . Если вы посмотрите на JavaScript в нижней части исходного кода сайта, то увидите, что используются два из этих редакторов (editor и outputeditor). Их методы setValue и getValue могут использоваться для работы с их содержимым.

Чтобы сделать это в AHK, вы можете создать на странице элемент, содержимое которого будет содержать данные буфера обмена, а затем результат форматирования. pwb2.document.parentWindow.execScript может использоваться для выполнения JavaScript для взаимодействия с редакторами с использованием данных из элемента буфера обмена.

^+b::
Clipboard := ""
Send {Ctrl Down}c{Ctrl Up}
ClipWait 1
if ErrorLevel {
    MsgBox Java formatter error: Clipboard is empty
    return
}
java := Clipboard

formatter := "https://www.tutorialspoint.com/online_java_formatter.htm"
pwb2 := ComObjCreate("InternetExplorer.Application")
pwb2.navigate(formatter)
while pwb2.busy
    sleep 15

d := pwb2.document
ahkData := d.createElement("div")
ahkData.id := "ahkData"
ahkData.hidden := true
ahkData.innerText := java
d.body.appendChild(ahkData)

js =
(
    var ahkData = document.getElementById('ahkData');
    var marker = "//AHKDATA\n";
    editor.setValue(marker + ahkData.innerText);
    outputeditor.on("change", function(e) {
        var value = outputeditor.getValue();
        if (value.indexOf(marker) !== -1) {
            ahkData.innerText = value.substring(marker.length);
            ahkData.hidden = false;
        }
    });
    document.getElementById("beautify").click();
)

d.parentWindow.execScript(js)

while ahkData.hidden
    sleep 150

Clipboard := ahkData.innerText
Send ^v
pwb2.quit()
Return

Обратите внимание, что обработчик нажатия для кнопки beautify возвращается до обновления outputeditor, поскольку он просто отправляет асинхронный POST-запрос с неформатированным кодом, поэтому я добавил обратный вызов в событие изменения outputeditor, которое будет выполнено, когда Запрос завершает и обновляет редактор. marker в этом обратном вызове служит для дифференциации событий изменения outputeditor, которые происходят из-за кода, первоначально включенного в веб-сайт, от событий, которые происходят после форматирования нашего кода. Я предполагал, что вы не хотите видеть окно IE и удалили его видимость, но если вы действительно хотите, чтобы оно было видимым, вам нужно будет использовать WinWaitActive или что-то подобное, чтобы дождаться закрытия окна IE и предыдущее (скопированное) окно снова станет активным перед отправкой Ctrl + v .

Поскольку форматирование действительно выполняется с помощью запроса POST, вместо этого можно использовать COM-объект WinHttp.WinHttpRequest.5.1 для репликации запроса. Однако IMO более громоздок (по крайней мере, в AHK), поскольку вам придется вручную кодировать код Java в буфере обмена.

...