Статья посвящена новой возможности окружения Unity в Ubuntu — линзам (lens). Что же такое линза в Unity? Просто говоря, линза — это область главного меню, в которой пользователь может осуществляет поиск локального и сетевого контента. О том, как можно просто её создать идёт речь в данной статье. Оригинальный текст отсюда (англ.)
Итак, для создания линзы, нам понадобятся:
* Ubuntu 12.04 LTS – получить Ubuntu ›
* Quickly – установить свободный quickly ›
* шаблон Quickly Lens – установить шаблон Quickly Lens ›
Для начала напишем линзу, которая ищет среди статей Википедии. Создание линзы начинается с простого шага — создания проекта. Для этого нажмите Ctrl+Alt+T и в появившемся окне терминала введите следующие команды:
Приступим!
Эта команда откроет три файла в вашем текстовом редакторе по умолчанию, нас интересует только __init__.py
Первое, что нам нужно, это Meta class. Здесь содержится описание нашей линзы. Смотрите:
Для начала, поскольку мы делаем простую линзу, здесь всё можно оставить без изменений.
Линзе нужны категории для визуального разделения разных типов результатов. Для Википедии нам понадобится всего одна категория, которую мы наречём «Articles»
После Meta class мы видим следующие строчки кода:
Мы будем модифицировать её для наших нужд.
* Во-первых, мы изменим имя категории на articles_category
* Затем, у нас есть выбор между ListView и IconView для различного представления результатов внутри категории. Мы выбираем: ListView
* Нам также нужно дать отображаемое имя для нашей категории. Всё просто: Articles
* И наконец, нам нужно выбрать иконку для нашей категории и мы возьмём её из рабочего пространства системы, а именно: dialog-information-symbolic
В итоге у нас получается строчка:
Внутренняя архитектура линзы готова, теперь мы приступаем к проектированию поиска.
Стандартный код шаблона демонстрирует как попадает результат в линзу:
… но ведь мы хотим спрашивать википедию…
Давайте сделаем новую функцию, которая призвана осуществлять поиск. Сделаем мы это следующим образом.
Мы назовём нашу функцию wikipedia_query. Она будет принимать строку поиска от пользователя как аргумент. Мы также возьмём ещё два модуля Python для наших нужд: urllib2 для отправки HTTP запроса в сеть и simplejson для обработки данных из Википедии.
В самом начале нашего файла мы подключаем нужные модули с помощью команды import
Затем, в класс WikipediaLens(SingleScopeLens) class, наш главный класс, мы добавляем переменную wiki, которая упростит наш код:
И создаём функцию
где search — это строка, которую пользователь вводит в окно поиска. Нам нужно её немного откорректировать, прежде чем отправлять Википедии, заменить пробелы на «|», иначе Вика не поймёт наш запрос.
Мы создаём наш запрос, используя открытый API Википедии.
И мы выводим полученный результат в переменную results, которая находится в json, для этого мы задействуем модуль simplejson
Мы добавляем отладочный вывод, чтобы понимать, что мы делаем:
И заканчиваем свою работу над функцией выводом результатов соответственно
Наша функция wikipedia_query выглядит почти как надо, нужно ещё добавить try и except для предотвращения ошибок (ошибки сети, результатов и т. п.). Для этого мы создаём информационное сообщение и пустой вывод.
Теперь нам нужно подключить свеже написанную функцию в давно существующюю search
Работет примерно так: поисковой запрос попадает в wikipedia_query, отправляется в викепедию, ответ в JSON возвращается в wikipedia_query, передаётся в search и отображается в линзе. Чтобы понять, что происходит в results.append очень важно посмотреть вывод в линзе. Он передаётся в Unity по шаблону:
Вот и всё готово!
Теперь наступил самый долгожданный момент — мы приступаем к использованию линзы!
Вводим команды в терминале:
После успешного тестирования и отладки линзы её можно окончательно установить в систему. Для этого вкратце расскажу о её внутренней структуре. Линзы требует для своей работы минимум три файла: файл .lens, содержащий основную информацию о линзе; исполняемый файл (демон), выполняющий всю работу и файл .service, содержащий имя линзы и путь к исполняемому файлу. Для их установки в систему в папке проекта создан файл setup.py
Я использовал для инсталляции следующие команды:
* Читайте подробную статью о структуре линз и их создании (рус.)
* Узнайте больше о Unity и сопутствующих технологиях (на англ.)
* Узнайте больше о линзах Unity (на англ.)
* Unity API
* Wikipedia opensearch API
* Линза, сделаннай по данному рководству
* Подборка линз для Dash
Требования
Итак, для создания линзы, нам понадобятся:
* Ubuntu 12.04 LTS – получить Ubuntu ›
* Quickly – установить свободный quickly ›
* шаблон Quickly Lens – установить шаблон Quickly Lens ›
Создание линзы
Для начала напишем линзу, которая ищет среди статей Википедии. Создание линзы начинается с простого шага — создания проекта. Для этого нажмите Ctrl+Alt+T и в появившемся окне терминала введите следующие команды:
quickly create unity-lens wikipedia
cd wikipedia
Приступим!
quickly edit
Эта команда откроет три файла в вашем текстовом редакторе по умолчанию, нас интересует только __init__.py
Первое, что нам нужно, это Meta class. Здесь содержится описание нашей линзы. Смотрите:
class Meta:
name = 'Wikipedia'
description = 'Wikipedia Lens'
search_hint = 'Search Wikipedia'
icon = 'wikipedia.svg'
search_on_blank=True
Для начала, поскольку мы делаем простую линзу, здесь всё можно оставить без изменений.
Линзе нужны категории для визуального разделения разных типов результатов. Для Википедии нам понадобится всего одна категория, которую мы наречём «Articles»
После Meta class мы видим следующие строчки кода:
example_category = ListViewCategory("Examples", 'help')
Мы будем модифицировать её для наших нужд.
* Во-первых, мы изменим имя категории на articles_category
* Затем, у нас есть выбор между ListView и IconView для различного представления результатов внутри категории. Мы выбираем: ListView
* Нам также нужно дать отображаемое имя для нашей категории. Всё просто: Articles
* И наконец, нам нужно выбрать иконку для нашей категории и мы возьмём её из рабочего пространства системы, а именно: dialog-information-symbolic
В итоге у нас получается строчка:
articles_category = ListViewCategory("Articles", "dialog-information-symbolic")
Внутренняя архитектура линзы готова, теперь мы приступаем к проектированию поиска.
Стандартный код шаблона демонстрирует как попадает результат в линзу:
def search(self, search, results):
# TODO: Add your search results
results.append('https://wiki.ubuntu.com/Unity/Lenses/Singlet',
'ubuntu-logo',
self.example_category,
"text/html",
'Learn More',
'Find out how to write your Unity Lens',
'https://wiki.ubuntu.com/Unity/Lenses/Singlet')
pass
… но ведь мы хотим спрашивать википедию…
Поиск в Википедии
Давайте сделаем новую функцию, которая призвана осуществлять поиск. Сделаем мы это следующим образом.
Мы назовём нашу функцию wikipedia_query. Она будет принимать строку поиска от пользователя как аргумент. Мы также возьмём ещё два модуля Python для наших нужд: urllib2 для отправки HTTP запроса в сеть и simplejson для обработки данных из Википедии.
В самом начале нашего файла мы подключаем нужные модули с помощью команды import
import urllib2
import simplejson
Затем, в класс WikipediaLens(SingleScopeLens) class, наш главный класс, мы добавляем переменную wiki, которая упростит наш код:
wiki = "http://en.wikipedia.org"
И создаём функцию
def wikipedia_query(self, search):
где search — это строка, которую пользователь вводит в окно поиска. Нам нужно её немного откорректировать, прежде чем отправлять Википедии, заменить пробелы на «|», иначе Вика не поймёт наш запрос.
search = search.replace(" ", "|")
Мы создаём наш запрос, используя открытый API Википедии.
url = ("%s/w/api.php?action=opensearch&limit=25&format=json&search=%s" % (self.wiki, search))
И мы выводим полученный результат в переменную results, которая находится в json, для этого мы задействуем модуль simplejson
results = simplejson.loads(urllib2.urlopen(url).read())
Мы добавляем отладочный вывод, чтобы понимать, что мы делаем:
print "Searching Wikipedia for %s" % (search)
И заканчиваем свою работу над функцией выводом результатов соответственно
return results[1]
Наша функция wikipedia_query выглядит почти как надо, нужно ещё добавить try и except для предотвращения ошибок (ошибки сети, результатов и т. п.). Для этого мы создаём информационное сообщение и пустой вывод.
def wikipedia_query(self,search):
try:
search = search.replace(" ", "|")
url = ("%s/w/api.php?action=opensearch&limit=25&format=json&search=%s" % (self.wiki, search))
results = simplejson.loads(urllib2.urlopen(url).read())
print "Searching Wikipedia"
return results[1]
except (IOError, KeyError, urllib2.URLError, urllib2.HTTPError, simplejson.JSONDecodeError):
print "Error : Unable to search Wikipedia"
return []
Теперь нам нужно подключить свеже написанную функцию в давно существующюю search
def search(self, search, results):
for article in self.wikipedia_query(search):
results.append("%s/wiki/%s" % (self.wiki, article),
"http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png",
self.articles_category,
"text/html",
article,
"Wikipedia Article",
"%s/wiki/%s" % (self.wiki, article))
pass
Работет примерно так: поисковой запрос попадает в wikipedia_query, отправляется в викепедию, ответ в JSON возвращается в wikipedia_query, передаётся в search и отображается в линзе. Чтобы понять, что происходит в results.append очень важно посмотреть вывод в линзе. Он передаётся в Unity по шаблону:
results.append (url,
icon,
category,
mime-type,
text,
comment,
drag and drop url)
Вот и всё готово!
Использование линзы
Теперь наступил самый долгожданный момент — мы приступаем к использованию линзы!
Вводим команды в терминале:
sudo quickly install
quickly run
Установка линзы
После успешного тестирования и отладки линзы её можно окончательно установить в систему. Для этого вкратце расскажу о её внутренней структуре. Линзы требует для своей работы минимум три файла: файл .lens, содержащий основную информацию о линзе; исполняемый файл (демон), выполняющий всю работу и файл .service, содержащий имя линзы и путь к исполняемому файлу. Для их установки в систему в папке проекта создан файл setup.py
Я использовал для инсталляции следующие команды:
chmod 777 setup.py
./setup.py build
sudo ./setup.py install
Ссылки
* Читайте подробную статью о структуре линз и их создании (рус.)
* Узнайте больше о Unity и сопутствующих технологиях (на англ.)
* Узнайте больше о линзах Unity (на англ.)
* Unity API
* Wikipedia opensearch API
* Линза, сделаннай по данному рководству
* Подборка линз для Dash