А теперь неспеша всё отрефакторим
Несколько дней назад я рассказывал о своём бессоном хакатоне, — ухаживая за дочкой во время её болезни, я особо не спал, а чтобы не умереть от безделья, придумал себе задачу — за ночь изобрести и реализовать способ вытащить из эмулятора спектрумовский электронный журнал «ZX-Ревю».
Способ я придумал, реализовал и выложил на «Гитхаб». Но мозгу задача понравилось, не могу остановиться и перестать думать о том как всё переделать. Уже начал накидывать новый прототип. Выкладывать целиком пока не буду, там не готово, но кое-какие куски покажу в нескольких постах — там много интересных проблем.
Первое, что мне хотелось бы сделать — избавиться от привязки к браузеру. В прошлой реализации я просто активизировал «Сафари», после чего считал, что в активном окне открыт нужный мне эмулятор. Я подумал, что хорошо бы посмотреть какие у нас запущены браузеры и проверить открыто ли в каком-то из них то, что мне нужно.
Так как я делаю всё под «Мак», программировать решил на «ЭплСкрипте» — так проще всего.
on is_running(appName)
tell application "System Events" to (name of processes) contains appName
end is_running
set browsers to {"Safari", "Chrome", "Opera", "Firefox", "Edge", "Yandex"}
repeat with browser in browsers
if is_running(browser) then
tell application browser
if exists window "ZX Spectrum online emulator" then
log browser
activate
exit repeat
end if
end tell
end if
end repeat
Что тут происходит? Я перебираю все известные мне браузеры по имени, ищу какие из них запущены, в них смотрю — называется ли активное окно «ZX Spectrum online emulator», если да, остаюсь в нём, сообщая наружу какой из браузеров найден.
Можно было бы ещё перебрать окна каждого из браузеров, но есть опасность остановиться не в том эмуляторе — мало ли, вдруг у человека несколько запущено. Сделать несложно, но кажется это может добавить проблем.
Так как основная оболочка у меня на «Баше», осталось как-то из «ЭплСкрипта» забрать имя найденного браузера. Я делаю это так:
BROWSER=$(osascript <<BROWSERS 2>&1
# … тут программа на «ЭплСкрипте»
BROWSERS
)
В итоге, в переменной $BROWSER будет лежать имя браузера или пусто, если подходящий не найден.
Перенаправление потока 2>&1 необходимо, так как команда log «ЭплСкрипта» выведет имя браузера в поток для ошибок, а конструкция $( … ) ждёт его в стандартном выводе.