Pull to refresh

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

Reading time 4 min
Views 11K
Статья посвящена новой возможности окружения Unity в Ubuntu — линзам (lens). Что же такое линза в Unity? Просто говоря, линза — это область главного меню, в которой пользователь может осуществляет поиск локального и сетевого контента. О том, как можно просто её создать идёт речь в данной статье. Оригинальный текст отсюда (англ.)

Требования



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

* 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


Установка линзы



После успешного тестирования и отладки линзы её можно окончательно установить в систему. Для этого вкратце расскажу о её внутренней структуре. Линзы требует для своей работы минимум три файла: файл .lens, содержащий основную информацию о линзе; исполняемый файл (демон), выполняющий всю работу и файл .service, содержащий имя линзы и путь к исполняемому файлу. Для их установки в систему в папке проекта создан файл setup.py
Я использовал для инсталляции следующие команды:

chmod 777 setup.py
./setup.py build
sudo ./setup.py install


image

Ссылки


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

Articles