Skip to content

Commit 48208f7

Browse files
committed
Speak selected text on PageWebView by any key.
1 parent a16dba3 commit 48208f7

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

ReaderTranslator/Components/WebView.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ struct WebView: UIViewRepresentable {
2525
}
2626
}
2727

28+
29+
//This hack to make PageWebView the first responder but the selection won't work
30+
//extension UIView {
31+
// public override func becomeFirstResponder() -> Bool {
32+
// // Actual view is instance of private class UIWebBrowserView, its parent parent view is UIWebView
33+
// if self.superview?.superview is PageWebView {
34+
// print(1)
35+
// return false
36+
// } else {
37+
// return super.becomeFirstResponder()
38+
// }
39+
// }
40+
//}
41+
2842
class PageWebView: WKWebView {
2943
@Published private var selectedText = ""
3044
@Published var newUrl = ""
@@ -47,6 +61,9 @@ class PageWebView: WKWebView {
4761
document.body.onload = function() {
4862
webkit.messageHandlers.onBodyLoaded.postMessage("txt")
4963
}
64+
document.body.onkeydown = function(event) {
65+
webkit.messageHandlers.onKeyPress.postMessage(event.code)
66+
}
5067
"""
5168

5269
init() {
@@ -70,6 +87,7 @@ class PageWebView: WKWebView {
7087
contentController.add(self, name: "onSelectionChange")
7188
contentController.add(self, name: "onContextMenu")
7289
contentController.add(self, name: "onBodyLoaded")
90+
contentController.add(self, name: "onKeyPress")
7391

7492

7593
_ = $selectedText
@@ -110,6 +128,18 @@ class PageWebView: WKWebView {
110128
}
111129
}
112130

131+
extension PageWebView {
132+
override public var keyCommands: [UIKeyCommand]? {
133+
//Voice selected text with any key since performCommand isn't fired because PageWebView isn't the first responder.
134+
SpeechSynthesizer.speech()
135+
return [.init(input: "1", modifierFlags: .command, action: #selector(performCommand))]
136+
}
137+
138+
@objc func performCommand(sender: UIKeyCommand) {
139+
print(sender)
140+
}
141+
}
142+
113143
extension PageWebView: WKScriptMessageHandler {
114144
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
115145

@@ -122,6 +152,10 @@ extension PageWebView: WKScriptMessageHandler {
122152
print("onContextMenu")
123153
case "onBodyLoaded":
124154
print("onBodyLoaded")
155+
case "onKeyPress":
156+
if let code = message.body as? String {
157+
if code == "Space" { SpeechSynthesizer.speech() }
158+
}
125159
default:
126160
print("webkit.messageHandlers.\(message.name).postMessage() isn't found")
127161
}

0 commit comments

Comments
 (0)