Ходячее н. (nestor_asa) wrote,
Ходячее н.
nestor_asa

преобразование sessionstore.js в html

Встала задача: сгенерировать нормальные списки открытых ссылок (табов и окон) из сохраненной сессии Mozilla Firefox.

Причины, по которым возникла задача:
* часто собираю уйму окон с открытыми ссылками, а потом, когда ссылок становится слишком много, приходится сохранять 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
Tags: cygwin, firefox, linux, mozilla
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments