我正在尝试使用https://www.tutorialspoint.com/online_java_formatter.htm格式化我的java代码。但我从textarea获取文本时遇到问题。我正在尝试从textarea中获取文本。
<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>
Autohotkey代码:
;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
答案 0 :(得分:0)
问题是您用于格式化代码的网站不使用普通<textarea>
,而是使用this code editor。如果您查看网站源代码底部附近的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
请注意,美化按钮的单击处理程序会在更新outputeditor
之前返回,因为它只是发送带有未格式化代码的异步POST请求,因此我添加了对outputeditor
更改事件的回调。将在请求完成并更新编辑器时运行。此回调中的marker
用于区分由于最初包含在网站上的代码而导致的outputeditor
更改事件与格式化代码后发生的更改事件。我假设您不希望看到IE窗口并删除其可见性,但如果您确实希望它可见,则需要使用WinWaitActive
或类似的东西等待IE窗口关闭以及之前( copy-from)窗口在发送 Ctrl + v 之前再次变为活动状态。
由于格式化确实是通过POST请求完成的,因此您可以使用WinHttp.WinHttpRequest.5.1
COM对象来复制请求。但是,IMO它更麻烦(至少在AHK中),因为你必须在剪贴板中手动编码Java代码。