update eaf package

This commit is contained in:
2021-01-30 14:52:51 +01:00
parent 84eb4929ee
commit 5207af83cb
4981 changed files with 11795 additions and 761570 deletions

View File

@@ -19,8 +19,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from PyQt5.QtCore import QUrl, QTimer, QEvent, QPointF, Qt
from PyQt5.QtGui import QColor, QMouseEvent
from PyQt5.QtCore import QUrl, QTimer, QPointF, Qt
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QApplication
from core.browser import BrowserBuffer
from core.utils import PostGui, get_free_port, interactive
@@ -30,6 +30,9 @@ import signal
import threading
import getpass
import json
from urllib import request
from http.server import SimpleHTTPRequestHandler
from socketserver import TCPServer
class AppBuffer(BrowserBuffer):
def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path):
@@ -37,81 +40,105 @@ class AppBuffer(BrowserBuffer):
# Get free port.
self.port = get_free_port()
self.http_url = "http://127.0.0.1:{0}".format(get_free_port())
self.url = url
arguments_dict = json.loads(arguments)
self.command = arguments_dict["command"]
self.start_directory = arguments_dict["directory"]
self.current_directory = self.start_directory
self.index_file = os.path.join(os.path.dirname(__file__), "index.html")
self.executing_command = ""
self.index_file = "{0}/index.html".format(self.http_url)
self.server_js = os.path.join(os.path.dirname(__file__), "server.js")
self.buffer_widget.titleChanged.connect(self.change_title)
http_thread = threading.Thread(target=self.run_http_server, args=())
http_thread.start()
self.search_term = ""
# Start server process.
args = ["node", self.server_js, str(self.port), self.start_directory, self.command]
self.background_process = subprocess.Popen(
"node {0} {1} '{2}' '{3}'".format(self.server_js, self.port, self.start_directory, self.command),
args,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True)
shell=False)
self.open_terminal_page()
self.reset_default_zoom()
QTimer.singleShot(250, self.focus_terminal)
QTimer.singleShot(250, self.focus_widget)
self.build_all_methods(self)
self.timer=QTimer()
self.timer.start(250)
self.timer.timeout.connect(self.on_change_directory)
self.timer.timeout.connect(self.checking_status)
def focus_terminal(self):
event = QMouseEvent(QEvent.MouseButtonPress, QPointF(0, 0), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
QApplication.sendEvent(self.buffer_widget.focusProxy(), event)
def run_http_server(self):
class Handler(SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
# directory=os.path.dirname(__file__), This argument add in python3.7 after
super().__init__(*args, **kwargs)
def translate_path(self, path):
# On python3.7 before version, http server don't support setting directory
# default use the project path.
path = super().translate_path(path)
return os.path.dirname(__file__) + path[len(os.getcwd()):]
with TCPServer(("127.0.0.1", int(self.http_url.split(":")[-1])), Handler) as h:
h.serve_forever()
@PostGui()
def open_terminal_page(self):
theme = "light"
if self.emacs_var_dict["eaf-terminal-dark-mode"] == "true" or \
(self.emacs_var_dict["eaf-terminal-dark-mode"] == "" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
(self.emacs_var_dict["eaf-terminal-dark-mode"] == "follow" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
theme = "dark"
with open(self.index_file, "r") as f:
html = f.read().replace("%1", str(self.port)).replace("%2", "file://" + os.path.join(os.path.dirname(__file__))).replace("%3", theme).replace("%4", self.emacs_var_dict["eaf-terminal-font-size"]).replace("%5", self.current_directory)
with request.urlopen(self.index_file) as f:
html = f.read().decode("utf-8").replace("%1", str(self.port)).replace("%2", self.http_url).replace("%3", theme).replace("%4", self.emacs_var_dict["eaf-terminal-font-size"]).replace("%5", self.current_directory).replace("%6", self.emacs_var_dict["eaf-terminal-font-family"])
self.buffer_widget.setHtml(html)
def on_change_directory(self):
changed_directory = self.buffer_widget.execute_js("title")
if not str(changed_directory) == self.current_directory:
self.update_title()
self.eval_in_emacs.emit('''(setq default-directory "'''+ str(changed_directory) +'''")''')
self.current_directory = str(changed_directory)
def checking_status(self):
changed_directory = str(self.buffer_widget.execute_js("title"))
changed_executing_command = str(self.buffer_widget.execute_js("executing_command"))
if len(changed_executing_command) > 30:
changed_executing_command = changed_executing_command[:30]
def update_title(self):
self.change_title(self.buffer_widget.execute_js("title"))
if changed_executing_command != self.executing_command and changed_executing_command != "":
self.change_title(changed_executing_command)
self.executing_command = changed_executing_command
elif changed_executing_command == "" and self.executing_command != "" or not changed_directory == self.current_directory:
self.change_title(changed_directory)
if not changed_directory == self.current_directory:
self.eval_in_emacs.emit('eaf--change-default-directory', [changed_directory])
self.current_directory = changed_directory
if self.executing_command != "":
self.executing_command = ""
if subprocess.Popen.poll(self.background_process) is not None:
self.destroy_buffer()
def destroy_buffer(self):
os.kill(self.background_process.pid, signal.SIGKILL)
super().destroy_buffer()
self.close_buffer()
self.timer.stop()
@interactive()
@interactive
def copy_text(self):
text = self.buffer_widget.execute_js("get_selection();")
if text == "":
self.message_to_emacs.emit("Nothing selected")
else:
clipboard = QApplication.clipboard()
clipboard.setText(text)
self.set_clipboard_text(text)
self.message_to_emacs.emit("Copy text")
@interactive()
@interactive
def yank_text(self):
text = QApplication.clipboard().text()
self.buffer_widget.eval_js("paste('{}');".format(text))
text = self.get_clipboard_text()
self.buffer_widget.eval_js("paste(`{}`);".format(text))
@interactive()
@interactive
def scroll_other_buffer(self, scroll_direction, scroll_type):
if scroll_type == "page":
if scroll_direction == "up":
@@ -124,27 +151,27 @@ class AppBuffer(BrowserBuffer):
else:
self.scroll_down()
@interactive()
@interactive
def scroll_up(self):
self.buffer_widget.eval_js("scroll_line(1);")
@interactive()
@interactive
def scroll_down(self):
self.buffer_widget.eval_js("scroll_line(-1);")
@interactive()
@interactive
def scroll_up_page(self):
self.buffer_widget.eval_js("scroll_page(1);")
@interactive()
@interactive
def scroll_down_page(self):
self.buffer_widget.eval_js("scroll_page(-1);")
@interactive()
@interactive
def scroll_to_begin(self):
self.buffer_widget.eval_js("scroll_to_begin();")
@interactive()
@interactive
def scroll_to_bottom(self):
self.buffer_widget.eval_js("scroll_to_bottom();")
@@ -154,6 +181,9 @@ class AppBuffer(BrowserBuffer):
def clear_selection(self):
self.buffer_widget.eval_js("clear_selection();")
def clear(self):
self.buffer_widget.eval_js("clear();")
def _search_text(self, text, is_backward = False):
if self.search_term != text:
self.search_term = text
@@ -164,27 +194,27 @@ class AppBuffer(BrowserBuffer):
# self.web_page.findText(self.search_term)
self.buffer_widget.eval_js("find_prev('{}')".format(text))
@interactive()
@interactive
def search_text_forward(self):
if self.search_term == "":
self.buffer.send_input_message("Forward Search Text: ", "search_text_forward")
self.send_input_message("Forward Search Text: ", "search_text_forward")
else:
self._search_text(self.search_term)
@interactive()
@interactive
def search_text_backward(self):
if self.search_term == "":
self.buffer.send_input_message("Backward Search Text: ", "search_text_backward")
self.send_input_message("Backward Search Text: ", "search_text_backward")
else:
self._search_text(self.search_term, True)
@interactive()
def search_quit(self):
@interactive
def action_quit(self):
if self.search_term != "":
self._search_text("")
def handle_input_message(self, result_tag, result_content):
if result_tag == "search_text_forward":
self.buffer_widget._search_text(str(result_content))
elif result_tag == "search_text_backward":
self.buffer_widget._search_text(str(result_content), True)
def handle_input_response(self, callback_tag, result_content):
if callback_tag == "search_text_forward":
self._search_text(str(result_content))
elif callback_tag == "search_text_backward":
self._search_text(str(result_content), True)