
В процессе работы над Pastemark (пост-анонс) мне понадобилось, во-первых, написать довольно сложный букмарклет и, во-вторых, сделать динамическую генерацию букмарклетов с разными параметрами. Не возьмусь претендовать на новизну, а лишь просто поделюсь найденным мною подходом.
Для тех, кто с ними еще не сталкивался с букмарклетами, букмарклет — это разновидность закладки, но от обычной закладки он отличается тем, что вместо адреса страницы в ней записан скрипт, как правило не очень большой.
Спектр применений букмарклетов довольно широк: от простого изменения размера шрифта на текущей странице до анализа ее содержимого и передачи извлеченных данных какому-нибудь третьему сервису. В качестве примера можно привести букмарклет твиттера.
Кроме того, букмарклет — это практически единственный шанс для честного вебмастера выполнить свой код в контексте чужого сайта (-:
Собственно, ответ уже дан в предыдущем параграфе. Фактически, букмарклет занимает промежуточную роль между скриптами на сайте и расширением браузера: его функциональность все еще ограничена по сравнению с полноценным расширением, но он уже не привязан к какому-то одному сайту. Еще одна приятная сторона — один и тот же букмарклет может работать во всех браузерах сразу, включая те, которые не поддерживают расширения как таковые (реверанс в сторону мобильных браузеров).
Основные концепции написания букмарклетов хорошо изложены в статье на javascript.ru. Я же не буду лишний раз повторяться и сразу перейду к своей методике.
Мы все привыкли писать нормальные JS-функции, пользуясь IDE или просто блокнотом, а букмарклеты требуют от нас вытягивать весь код в одну строчку да еще и экранировать, что довольно муторно. Поэтому логично переложить эту работу на программу, а еще лучше — позволить программе самой себя приводить в нужный вид.
И так, прежде всего, нам нужно написать функцию, из которой мы будем делать букмарклет. Здесь нам все близко и знакомо, лишь только вместо привычного синтаксиса
function my_bookmarklet() { /* ... */ }
Мы прибегнем к альтернативному варианту:
var my_bookmarklet = function(arg1, arg2) { /* ... */ }
Это связано с тем, что в букмарклете нам нужна не именованная функция, а анонимная, чтобы не засорять пространство имен и избежать конфликтов.
После того, как мы написали функцию, нам нужно превратить ее в букмарклет. Краткости ради я сразу приведу фрагмент кода, выполняющий эту функцию:
// Ключевой момент: делаем из анонимной функции строку с ее исходниками. var code = my_bookmarklet.toString(); // Вырезаем однострочные и многострочные комментарии. code = code.replace(/\/\/.*/g, ""); code = code.replace(/\/\*[\s\S]*\*\//, ""); // Заменяем переносы строк пробелами code = code.replace(/\n/g, " "); // Вырезаем повторяющиеся пробелы. Если у вас внутри строковых литералов // есть повторяющиеся пробелы, то этого лучше не делать. code = code.replace(/\s+/g, " "); // Генерируем uri, при этом экранируем спецсимволы. var link = encodeURI("javascript:void("+code+"(\""+value_for_arg1+"\", \""+value_for_arg2+"\"))");
Обратите внимание на переменные value_for_arg1 и value_for_arg2. Если вам нужно (как в моем случае) генерировать параметризованные букмарклеты, то вы можете это легко реализовать, передавая параметры вашей анонимной функции.
Далее с переменной link можно делать все, что хотите — генерировать и вставлять на страницу ссылку с этим значением href, отображать просто так или что вам еще в голову придет.
Есть только одни грабли, на которые легко попасться в процессе написания букмарклета таким способом: ни в коем случае нельзя пользоваться какими-либо функциями или переменными, объявленными вне экспортируемой функции, ведь во время исполнения букмарклета (а это почти наверняка произойдет не на вашем сайте и в чужом окружении) все они доступны не будут. Я, кстати, на эти грабли тоже наступил, правда, довольно быстро это обнаружил и исправился.
В качестве итога еще раз перечислю все бонусы, которые мы получаем при разработке букмарклетов таким способом:
Вот и пришло время анонсировать мини-проект, над которым я работал последнее время.
Отправной точкой для мысли послужил тот факт, что в процессе модерирования на phpBB Guru мне довольно часто приходилось писать служебные посты и личные сообщения примерно одинакового содержания. В какой-то момент мне это окончательно надоело и я занялся поиском расширения для браузера, которое позволило бы хранить и быстро вставлять сниппеты с шаблонами этих сообщений. Каково же было мое удивление, когда я не нашел ничего вменяемого.
Следующим витком поиска стал поиск десктопной проги, но я быстро отказался от этой затеи, поскольку на десктопе и нетбуке у меня используются разные среды и не хочется ни терпеть белую ворону на одном из них, ни привыкать к двум разным прогам. Да и опять же, на нетбуке не так уж и много оперативки, чтобы вешать туда еще что-то.
Третий шаг был типичен для любого программиста — написать свою мини-тулзу. Расширение для FireFox мне писать не захотелось, я уже когда-то связывался с этим и мне совершенно не понравилось: муторно, документация разрозненная, неудобно отлаживать и долго тестировать. И тогда я вспомнил про букмарклеты.
Сделать набор букмарклетов, которые будут при активации на нужной станице искать поле по заданному критерию и вставлять туда заготовленный текст.
Для удобства использования я на коленке набросал простенький генератор «для себя». Он принимал id поля и текст, выдавал — ссылку-букмарклет. Потом пришли мысли о том, что не всегда можно найти поле по id и была добавлена поддержка атрибута name, а потом еще и выбор по клику. О генераторе, кстати, будет отдельный пост.
Чем дальше я совершенствовал инструмент, тем больше мне хотелось сделать из него что-то общеполезное, и в итоге я решил сделать из него микро-вебсервис и заодно поупражняться в свистелках и перделках верстке и JavaScript.
Название сервиса было образовано из двух слов — «paste» и «bookmark» (и тут же было переведено моей девушкой на русский как «пастомарка» (-: ).
Вот что в итоге этот сервис умеет:
Кроме того, поскольку я по привычке изначально сделал англоязычный интерфейс, сайт существует на двух языках: русском и английском.
Поскольку в своей работе я занимаюсь сервер-сайд программированием, этот проект стал для меня хорошим шансом разнообразить дела и поупражняться в верстке и клиентских финтифлюшках. Поэтому в итоге получилось, что основу сервиса я написал за два неполных вечера, а потом еще неделю оттачивал дизайн и лепил маленькие, но удобные плюшки. Например, сайт умеет подсказывать пользователю, что есть более удобная ему локализация, основываясь на содержимом заголовка Accept-Language. И таких мелочей получилось довольно много, что доставило мне массу удовольствия в процессе написания и тестирования :-)
Разместил я новый сервис, кстати на vps от eomy.net (и реферралка во имя вселенской жадности). Правда о vps я сказал не просто ради пиара, а чтобы поделиться своей находкой. Недавно я открыл для себя очень интересный веб-сервер cherokee, просто подкупившим меня своею легковесностью и изумительным веб-интерфейсом для его настройки. Уверен, будущее именно за таким софтом - свободным, быстрым и юзабельным.
Я не умер, не забил, не подался в отшельники :-)
Причина для молчания довольно банальна — в моей жизни наступил довольно интересный период, который поедает массу времени, почти не оставляя времени на блог. Беда в том, что есть масса тем, на которые я хотел бы написать, но они все довольно емкие и требуют времени, которого вечно нет.
Стыд и позор, но последняя запись в этом блоге датируется аж ноябрем и это надо исправлять, чем я и постараюсь заняться. Я даже немного приоткрою завесу тайны и скажу, что это будет цикл статей по внутреннему устройству phpBB с точки зрения модописателя. Естественно, будут посты и на другие темы.
Сила мира open source — сообщество. Фокус силы — его ядро, те, кто поддерживают, развивают свой любимый продукт. И помогают другим полюбить его. Я пишу для тех, кто волей судьбы стал таким человеком, добровольно взвалив на себя тяжелый труд тех поддержки.
Мы выбираем технологию, мы ее любим, холим и пытаемся развивать просто потому, что она нам нравится. Но таких, как мы, мало. Большая часть сообщества — простые пользователи, им не важна технология и ее внутренняя красота, а результат. То, что интересно нам, не интересует их. То, что нам очевидно, для них выглядит бессмыслицей.
Какие бы глупые вопросы он не задавал. Я готов поспорить, что любой из нас начал свое знакомство с IT с глупого вопроса. И на этот вопрос был дан понятный ответ. Прошедшие годы ничего не изменили, и новички по-прежнему имеют право на понятный ответ.
Уважай себя. Делай так, чтобы тебя уважали другие. «Боятся — значит уважают» — это не про нас. Да и вообще ни про кого, если уж на то пошло.
...то проблема скорее всего в тебе. Не спорю, очень достает отвечать на одни и те же вопросы, но такова твоя обязанность. Если сил больше нет — возьми тайм-аут, отдохни, пока не будешь готов снова и снова давать ссылки на фак. Возможно, этот тайм-аут окажется длинной на всю оставшуюся жизнь, но в этом нет ничего страшного, надо уметь вовремя уйти. Свои нервы дороже.
Признаюсь, я давно хотел написать этот пост. Уже недели три точно. Однако, учеба и работа успешно съедали все мое время и пост постоянно откладывался. И все же я наконец выкроил свободный вечер и хочу поделиться с вами своими мыслями по поводу облачных сервисов.
Несмотря на то, что термин "облачные вычисления" был затаскан маркетологами совершенно не милосердно, тенденция переносить данные в "облака" видна очень ясно. Почему это происходит? Я полагаю, все дело в том, что сейчас у каждого из нас есть пачка гаджетов различной степени умности и потребность синхронизировать данные между ними. Во всяком случае, это стало решающей причиной для меня: в разные моменты я использую нетбук, настольный компьютер, рабочий компьютер и телефон и, понятно, хочу иметь доступ к своей почте, файлам и контактам отовсюду.
Отправной точкой для меня стала почта. Исторически у меня было 7 разных почтовых ящиков, которые нужно было читать. Они все были забиты в настройки почтовика на моем настольном компе и на нем же был примерно четырехлетний архив переписки. В итоге, доступ к большей части почты у меня был только из дома, что создавало массу неудобств. В какой-то момент я принял волевое решение настроить сборку почты на моем основном ящике GMail'a и импортировать туда весь архив, заодно сменить kmail на более продвинутый Thundebird и архаичный POP3 на IMAP.
Потратив один выходной, я все это сделал и принялся наслаждаться результатами труда: дома я по-прежнему пользовался почтовиком, с остальных девайсов — веб-интерфейсом GMail. И через пару недель я начал осознавать, что IMAP не вполне корректно работает с ярлыками GMail'a, а основная польза от почтовика — счетчик писем в трее. В итоге, Thunderbird в одночасье оказался заменен на аддон для Firefox WebMail Notifier и веб-интерфейс почты. Так я полностью перенес поту в облако.
Параллельно с этим я стал пользоваться такими штуками, как DropBox (рефералка принесет мне и вам лишних 200 мб бесплатной квоты), с помощью которого я стал обмениваться файлами с коллегами и значительно уменьшил беготню с флешкой от компа к нетбуку и обратно. Read It Later стал перекидывать ссылки на почитать между компами и на телефон. Todoist заменил стикеры и выгодно отличается от них тем, что он не приклеен к одному монитору. Оказалось, что даже для телефона есть его клиент (глючноватый, но есть). Xmarks утащил в облако мои закладки (хотя тут с облачностью можно поспорить, но тем не менее). Жить стало чуточку легче.
Но всему есть цена, и облачность — не исключение. Платить приходится тремя вещами:
Я довольно долго шел к тому ,чтобы принять эту цену, но в конце концов удобство окупило ее.
А что вы думаете об облаках? Чем пользуетесь или собираетесь использовать? А может у вас есть аргументы против? Мне интересно услышать ваше мнение!
Последние комментарии
/Гость/ 2 недели 5 дней назад
/Гость/ 5 недель 22 часа назад
/Alek$/ 12 недель 3 дня назад
/Alek$/ 12 недель 3 дня назад
/Гость/ 12 недель 3 дня назад
/Гость/ 12 недель 3 дня назад
/marintsSER/ 14 недель 6 часов назад
/Alek$/ 16 недель 3 дня назад
/Виталий/ 16 недель 4 дня назад
/Alek$/ 18 недель 1 день назад