Тот, кто когда-нибудь интересовался вопросом “подгонки” JIRA, Confluence или другого продукта Atlassian под себя, знает, что для этих целей существует Atlassian SDK. А тот, кто в этом SDK хоть раз копался, представляет, сколько времени и маленьких серых клеточек следует потратить, чтобы во все это вникнуть, особенно если под боком нет старшего товарища, который будет наставлять на путь истинный. Особенно обидно, когда в разгар работы над важным проектом, при катастрофической нехватке времени, кто-то из клиентов просит прикрутить какую-то маленькую рюшечку в Confluence или спрятать какую-нибудь ссылочку в JIRA. И клиентов приходится просить подождать, на что те имеют привычку обижаться. А усугубляет проблему тот факт, что у клиента зачастую есть свои штатные программисты, которые, к сожалению, ничем помочь не могут, т.к. не обладают знаниями в разработке плагинов для продуктов Atlassian и приобрести этот опыт за пару дней не выйдет. Видимо, это понимают и ребята из Atlassian, поэтому и представили на суд пользователей и администраторов технологию Speakeasy. Сама технология уже не нова — представление её ранней беты было приурочено к Codegeist 2011, соревнованию для разработчиков плагинов, но только сейчас, похоже, выходят более-менее стабильные версии, которые можно не побояться установить в production-систему. Speakeasy, в отличие от Atlassian SDK, позволяет кастомизировать только то, что видит пользователь — изменять страницы, добавляя на них JavaScript, разметку или стили. Но и делается это намного проще, чем с использованием SDK. Что-то подобное делает Firefox-дополнение Greasemonkey, но здесь мы не ограничиваемся одним браузером и не заставляем самого пользователя что-то там еще специально устанавливать. Хотя так и тянет назвать Speakeasy массовой технологией, которая позволит кастомизировать JIRA и Confluence любому пользователю, очевидно, это не совсем так. В большинстве случаев (но не всегда) понадобятся базовые навыки JavaScript-программирования и верстки HTML+CSS. Но зато для этого не нужно читать доки по Atlassian SDK! А это, на минуточку, сотни интересных и интригующих страниц на английском. Поэтому в число людей, которые могут получить profit от Speakeasy, я бы причислил: Давайте создадим с нуля несколько простых, но полезных расширений. Все примеры приведены для Confluence 3.5, т.к. свежая версия 4.0 еще не так сильно пошла в народ. Но практически все нижесказанное будет адекватно и для 4-й версии. Соответственно, никаких принципиальных отличий не будет и при разработке расширения для JIRA. Для начала все-таки понадобится администратор, чтобы установить Speakeasy на сервер и раздать нужные права. Свежие и не очень версии Speakeasy раздают в Plugin Exchange и в соответствующем maven-репозитории. После того, как плагин установлен, следует определиться, у каких групп пользователей будет право на создание своих расширений, а какие группы пользователей смогут эти расширения для себя включать (Administration — Plugins — Manage Existing — Speakeasy Plugin — Configure). Следует отдельно отметить, что по умолчанию администратору запрещено включать для себя расширения на Speakeasy. Сделано это, очевидно, в целях безопасности. Но на тестовой системе настройку «Allow administrators to enable extensions» можно и включить. В этом примере добавим ссылку на историю страницы на видное место, чтобы не лазить каждый раз за ней в выпадающее меню. Идем на страницу с расширениями Speakeasy. Жмем ссылку Install и в появившемся диалоге выберем использование Wizard-а, а в самом Wizard-е введем уникальный идентификатор расширения, его название и описание. После этого будет создано и установлено расширение с такими «параметрами» и стандартным тестовым наполнением. Кнопочкой «More — Edit» мы попадаем в простенький, но полезный web-редактор, где можем и запрограммировать пару строчек нашего расширения.  Нас интересует файл main.js, ибо в нем и должна находиться основная логика на JavaScript. Для знающего JS и jQuery человека написание таких строк не составит вообще никакого труда, но и те, кто с JavaScript не дружит, смогут написать подобный код при помощи google. Отдельно только упомяну про запись "@context page" в комментарии. Она указывает, на каких контекстах (читай, типах страниц) следует выполнять этот скрипт. Сейчас нас интересуют только wiki-страницы, а перечень контекстов можно найти на этой странице. А вот что мы получим в результате: Модифицировать что-то в стандартном UI — это здорово, а еще лучше, когда мы можем наполнить модифицированный UI какой-то новой информацией. Для получения информации можно использовать все возможности JavaScript/JQuery — REST, SOAP, XML-RPC. Благо у Confluence и JIRA такие интерфейсы есть. Попробуем воспользоваться самым простым REST-интерфейсом, по которому можно только получать информацию о различных сущностях из Confluence. Запросим дату создания страницы, чтобы органично разместить её в стандартном интерфейсе Confluence рядом с датой последнего редактирования. Код в этом случае выглядит так: А вот и модифицированный UI: Т.к. все скрипты отрабатывают при загрузке страницы, то пользователь не замечает никаких “мельканий” вроде “даты не было и внезапно появилась”. В расширениях на Speakeasy доступны и некоторые специфические для продуктов Atlassian вещи. Среди них — работа с WebItem. Говоря по-простому, у вас есть возможность добавить свои пункты меню на страницы, рядом со стандартными пунктами. Для этого, внутри расширения находится файл web-items.json, в котором описывается нужный вам пункт меню. Перейдем сразу к примеру: Здесь создается новый пункт с названием Revert в меню Tools. В параметре URL может задаваться нужный вам адрес, но я поступил немного хитрее и не задал URL, но добавил этому пункту логику на JavaScript (см. далее). Сам пункт нужен, чтобы быстро откатиться на предыдущую ревизию страницы, а код на JavaScript, соответственно, вычисляет номер этой ревизии: Выглядит этот пункт так: Не забыли разработчики SpeakEasy и о любителях создавать красивые интерфейсы. В сам Speakeasy включена возможность создать красивый диалог, в стиле самого Confluence/JIRA с помощью метода openOnePanelDialog. Вот так это выглядит в коде: Этот код добавляет к заголовку страницы ссылочку View Source, которая, собственно, и выводит красивый диалог с исходным кодом страницы. В расширении было еще немного магии с CSS, чтобы скрыть лишние кнопки диалога, но для примера это не самое важное. Примерно вот так, это выглядит на экране: Для тех, кому одного диалога не достаточно, стоит обратиться к библиотеке AUI (Atlassian User Interface). Это полностью клиентская JavaScript-библиотека, содержащая все те основные элементы (диалоги, попапы, выпадающие меню и т.п.), из которых собирается интерфейс продуктов Atlassian. Поэтому ваше расширение, использующее AUI, не будет отличаться по внешнему виду от остального интерфейса. Чтобы сразу “окунуться” в эту технологию, советую посетить AUI Demo, AUI Sandbox и немного поиграться с элементами там присутствующими. Самые ленивые из нас могут воспользоваться специальным Firefox-плагином (созданном на основе platypus), который позволяет визуально вносить изменения в страницу, а затем сохранять получившиеся изменения в виде SpeakEasy-расширения. И, конечно же, лучше один раз увидеть. Видео от разработчиков: Технология Speakeasy продолжает развиваться, хотя, надо сказать, ничего сверхъестественного в ней нет. Зато есть удобное и полезное. Станет ли Speakeasy “штатной” для продуктов Atlassian технологией и будет ли идти в стандартной поставке — покажет время и активность расширениеписателей. Но это никак не помешает нам сделать уже сегодня свою жизнь чуточку проще :)