Причины, по которым возникла задача:
* часто собираю уйму окон с открытыми ссылками, а потом, когда ссылок становится слишком много, приходится сохранять sessionstore.js в другом месте и все обнулять, чтобы не тормозить систему. Часть ссылок при этом остаются непросмотренными и актуальными; нужно найти способ безболезненного возврата к старым сессиям, с сохранением текущей сессии и без насилования браузера, чтобы он не пытался грузить те ссылки, которые уже не нужны;
* нужно собрать несколько сессий с разных компьютеров на одном.
Готовых велосипедов, работающих более менее нормально, не нашлось.
Примеры типа вот этих страдают тем, что выдергивают абсолютно все ссылки, что неверно, если в каждом табе есть собственная история; в результате вываливается вся история, мне это не нужно; положение также осложняется AJAX-страницами и страницами с фреймами, у них есть списки подчиненных урлов. Также не нашел решения в области конвертирования JSON->XML->HTML.
Решение (работает в нативной linux-среде или в cygwin, отладка велась в cygwin 1.7):
#!/bin/bash
echo '<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"></head><body>'
grep -oP '"windows":.*?"selectedWindow"' |\
grep -oP '"tabs":.*?"selected"' |\
while read AllTabsInTheWindow; do
echo '***** WINDOW<br><ul>'
echo $AllTabsInTheWindow | grep -oP '"entries":.+?"index":.+?,' |\
while read AllUrlsInTheTab; do
index=`echo $AllUrlsInTheTab | grep -oP '"index":\K[0-9]+'`
i=1
echo $AllUrlsInTheTab | grep -oP '{.*}' |\
sed -re 's/\[\{([^]]|[^}]])*}]//g' |\
grep -oP '{"url".+?}' |\
while read OneUrlInTheTab; do
if [ $i -eq $index ]; then
URL=`echo $OneUrlInTheTab | grep -oP '"url":"\K[^"]+'`
TITLE=`echo $OneUrlInTheTab | grep -oP '"title":"\K[^"]+'`
TITLE=${TITLE:-$URL}
echo "<li><a href='$URL'>$TITLE</a></li>"
fi
i=$(($i+1))
done
done
echo '</ul><br>'
done
echo '</body>'
запуск (если скрипт назвали session2html):
session2html <sessionstore.js >session.html
Для тех кто пожелает доработать или изменить (и для самого себя чтобы потом не забыть), разбираем по частям:
#!/bin/bash
явно используем bash (то есть не нужны сюрпризы с dash и т.п.)
echo '<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"></head><body>'
html заголовок
grep -oP '"windows":.*?"selectedWindow"' |\
выделяем часть, относящуюся к текущему набору окон (то есть отсекается часть про уже закрытые окна)
grep -oP '"tabs":.*?"selected"' |\
информация разбивается на отдельные строки - в каждой строке табы из одного окна
while read AllTabsInTheWindow; do echo '***** WINDOW<br><ul>'
цикл по окнам, html оформление начала списка окна
echo $AllTabsInTheWindow | grep -oP '"entries":.+?"index":.+?,' |\
табы разбиваются на отдельные строчки - одна строка - один таб с всей собственной историей
while read AllUrlsInTheTab; do
index=`echo $AllUrlsInTheTab | grep -oP '"index":\K[0-9]+'`определяется порядковый номер активной ссылки во всей истории таба
i=1
echo $AllUrlsInTheTab | grep -oP '{.*}' |\Отбрасываются символы [ и ] вокруг истории таба, нужно для корректной работы следующей строки
sed -re 's/\[\{([^]]|[^}]])*}]//g' |\Самое сложное во всем этом - отбрасываются вложенные массивы (массивы children для документов с вложенными элементами. Возможно некорректное удаление дважды вложенных массивов; если такая ситуация встретится, сообщайте, будем дальше думать)
grep -oP '{"url".+?}' |\история ссылок текущего таба (вычищенная от массивов вложенных ссылок) разбивается на строчки
while read OneUrlInTheTab; do
if [ $i -eq $index ]; thenобрабатывается только та строчка, которая соответствует ранее определенному номеру
URL=`echo $OneUrlInTheTab | grep -oP '"url":"\K[^"]+'`
TITLE=`echo $OneUrlInTheTab | grep -oP '"title":"\K[^"]+'`
TITLE=${TITLE:-$URL}формируется название и ссылка; если название пустое, то вместо названия выводится сама ссылка
echo "<li><a href='$URL'>$TITLE</a></li>"
вывели собственно ссылку
fi
i=$(($i+1))вычисляем номер следующего элемента в списке
done
done
echo '</ul><br>'окончание списка табов в текущем окне, переходим к следующему окну
done echo '</body>'
закрыли html
В написании этого скрипта также помогла программка JSON Viewer
May 18 2010, 14:12:59 UTC 2 years ago
May 18 2010, 14:30:38 UTC 2 years ago
Я думаю, что надо приделать парсер JSON, встроенный в PHP, и выкинуть 50% кода.