Свифт-хакатон от CocoaHeads Moscow
На прошлых выходных ребята из CocoaHeads Moscow устраивали первый (в мире?) Свифт-хакатон. (Свифт — это новый язык Эпла для программирования под Айось и Макось.) Хакатон проходил в Москве, в офисе Мейл.ру два дня подряд.
Хакатон — это когда программисты собираются и без остановок программируют. Два дня и всю ночь около 50 человек, — айос-разработчиков, — которые придумали себе достаточно сложные задачи, решали их, чтобы предложить миру эти решения.



В офисе Мейл-ру очень хорошо и уютно. Свежие соки, кофе, чай, кола, печеньки, массажные кресла и переговорки — все, что угодно было для нас бесплатно в эти выходные. И еда. Невероятно приветливые повара на кухне кормили нас три раза в день, огромное спасибо им за это. И это для того, чтобы мы хорошо работали и не скучали :) И мы работали!
Мы с ребятами собрались в команду, чтобы решить задачу вычленения основного текста из контента веб-страниц. Поделились на две группы: первая делает пользовательский интерфейс приложения, вторая — парсер и распознавалку ссылок и текста страниц.
Стоит отметить, что, конечно же, есть гемы и другие серверные решения для этой задачи. А в нашем случае парсинг происходит непосредственно на айос-устройстве. Потому что это Свифт-хакатон!


Мы стали экспериментировать с подходами к разработке. Создали два таргета в Икскод-проекте, две ветки в Гите (и потом задолбались их мерджить, но зато комильфо!) А также проектирование, прототипирование, какао-поды и т. д.
Столкнулись с кучей проблем и интересных решений. Расскажу подробнее. Есть несколько основных способов узнать что является основным текстом среди всего контента веб-страницы:
- вытащить текстовые хтмл-теги (article, h1...6, p и т. д.), но это не везде хорошо работает
- поискать самый длинный контент в тегах, но это не гарантирует основной текст
- посчитать количество точек в каждом теге и, где больше, — там основной текст, но это жесть
- предложить юзеру указать на основной текст, лол
Мы решили комбинировать несколько разных методов, и, рекурсивно пройдя по дереву элементов, нашли текстовые теги, нашли их родительский элемент, нашли похожие цсс-классы среди них. Подсчитали цену (удельный вес) атрибутов каждого элемента, вытащили это из остального контента и собрали итоговый текст. А главное, что сначала наше приложение парсит первую страницу почти любого указанного сайта, и вытаскивает ссылки на внутренние страницы.
За рамками отведенного на хакатон времени еще осталась куча придуманных фич. Но в результате получилось 139 коммитов, и отличная база для дальнейшей работы.
Все проекты лежат на гитхабе CocoaHeads Moscow:
- наш проект называется Black Hole и лежит в репозитории Hawking
- Илюха игрался со SpriteKit на Свифте, и в итоге портировал Марио
- Никита разбирался с кастомными экстеншенами для Сафари, которые вызывают отдельный вью-контроллер приложения
- ребята из Мейл-ру делали ICQ на Свифте с использованием CoreData — очень круто
- интересный чат по блютусу
- кто-то игрался с тач-айди-апи
- и еще команда ребят из Нижнего делала геолокационный сервис на Свифте
- реактив-нетворкинг на Свифте команды Димы
- и еще одни ребята делали межстрочный перевод поверх текста, но ничего не выложили.
Спасибо CocoaHeads Moscow и огромное спасибо компании Мейл-ру. Было здорово!
Здание Мейл-ру и вид из офиса во время рассвета:

А я бы посмотрел на api instapaper, readbility, safari reader или типо того. Они же уже умеют вычленять. Или вы как раз их и пытались повторить?
Ага, хотели разобраться как это делать, повторить и выложить в опенсорс :)
Я тоже хотел там быть, но увы не успел приехать вовремя в Москву. А теперь, вот, живу тут ) буду учавствовать во всех подобных штуках теперь )))