Простой способ создать Unity Lens для Ubuntu (перевод)

в 17:42, , рубрики: lens, linux, Ubuntu, unity, unity3d, метки: , ,

Требования

Итак, для создания линзы, нам понадобятся:

* Ubuntu 12.04 LTSполучить Ubuntu
* Quicklyустановить свободный quickly
* шаблон Quickly Lensустановить шаблон Quickly Lens

Создание линзы

Для начала напишем линзу, которая ищет среди статей Википедии. Создание линзы начинается с простого шага — создания проекта. Для этого нажмите Ctrl+Alt+T и в появившемся окне терминала введите следующие команды:

quickly create unity-lens wikipedia
cd wikipedia

image
Приступим!

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

image

Ссылки

* Оригинал статьи на английском
* Узнайте больше о Unity и сопутствующих технологиях (на англ.)
* Узнайте больше о линзах Unity (на англ.)
* Unity API
* Wikipedia opensearch API
* Линза, сделаннай по данному рководству
* Подборка линз для Dash    

Автор: Fantiney

Поделиться

* - обязательные к заполнению поля