Требования
Итак, для создания линзы, нам понадобятся:
* 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
Ссылки
* Оригинал статьи на английском
* Узнайте больше о Unity и сопутствующих технологиях (на англ.)
* Узнайте больше о линзах Unity (на англ.)
* Unity API
* Wikipedia opensearch API
* Линза, сделаннай по данному рководству
* Подборка линз для Dash
Автор: Fantiney