perl на читалке. Поддержка .mht
Goto page 1, 2, 3  Next
 
Libroom Forum IndexPocketBookPocketBook Free
AuthorMessage

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 06.01.2013 16:56    

Решил довести идею с perl до практического применения Wink

Итак, для более-менее работащего набора модулей пришлось распаковать, кроме perl-base, perl и perl-modules. С симлинками решил не морочиться, директорию 5.10.1 переименовал в 5.10 - оказалось этого достаточно.

Какое этому есть практическое применение? Например, как организовать поддержку mht?
Есть скрипт unmht (http://www.volkerschatz.com/unix/uware/unmht.html). Для него нужны модули из liburi-perl, libhtml-parser-perl, libhtml-tagset-perl.

Чтобы файлы mht видела библиотека, добавим строчку
Code:

mht:@HTML_file:1:unmht.app:ICON_HTM

в system/bin/extensions.cfg

Файлик /mnt/ext1/system/bin/unmht.app имеет вид
Code:

#!/bin/sh
in="$1"
out=/tmp/unmht/html

export LD_LIBRARY_PATH=/mnt/ext1/usr/lib
export PERLLIB=/mnt/ext1/usr/lib/perl/5.10:/mnt/ext1/usr/share/perl/5.10:/mnt /ext1/usr/lib/perl/5.10_:/mnt/ext1/usr/lib/perl5:/mnt/ext1/usr/share/ perl5

mkdir -p "$out"

perl=/mnt/ext1/usr/bin/perl
unmht=/mnt/ext1/system/bin/unmht
html=`$perl $unmht -o "$out" -l "$in"|grep text/html|awk '{print $1}'`
echo "html=$html"
$perl $unmht -o "$out"  "$in"
htmlfile="$out/$html"
echo "htmlfile=$htmlfile"
/ebrmain/bin/openbook /ebrmain/bin/browser.app "$htmlfile"


Как видно, mht преобразовывается в html и открывается броузером. (Если в 4.0 броузер не умеет открывать локально сохраненные файлы - Rolling Eyes ). fbreader почему-то открывать не захотел.


Все, кроме extensions.cfg, здесь: http://files.mail.ru/ANBGSI
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 06.01.2013 19:17    

pal wrote:
fbreader почему-то открывать не захотел.

Какие права устанавливаются на временную папку, может не хватает прав?
На 602-м ни чем не удалось открыть, как будто приложения не видят временную папку.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 06.01.2013 20:37    

Спасибо! (особенно за Perl)

Только сел разбираться с mht и думал писать обработчик сам, так как на CPAN ничего хорошего не нашел -- а тут уже есть решение!!!

(Кстати, на CPAN есть пакет

http://search.cpan.org/~dami/MsOffice-Word-HTML-Writer-1.01/lib/MsOffi ce/Word/HTML/Writer.pm

который может транслировать doc, и вроде odt, в mht, может пригодится)

Я перебрал коллекцию своих mht на Покете и выяснил, что coolreader спотыкается, если основной текст "завернут" в Quoted-Printable (Mozilla unmht) или Base64 (Opera, Internet Explorer), т.е. если скажем основной текст в обычной UTF-8, то страничка вполне читаема кулридером безо всяких фокусов сразу.

Таким образом, можно сделать более простой perl-скрипт, который раскодирует лишь нужные куски и потом передаст его кулридеру.

Впрочем, сам я думал как раз о полной распаковке на составляющие файлы (и возможной переделке относительных ссылок). Надо погонять этот unmht... Smile
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 06.01.2013 21:08    

transient wrote:
Таким образом, можно сделать более простой perl-скрипт, который раскодирует лишь нужные куски и потом передаст его кулридеру.

Это было бы полезно, у меня почти все mht сохранены плагином из под мозилы, и кулридер добросовестно показывает этот Quoted-Printable.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 06.01.2013 23:35    

Черновую тупейшую версию perl-скрипта сделал. Работает пока только на Desktop'e (Linux, Windows) и приводит к виду, читаемому coolreader'ом. С Покетовской версией поколдую, как запущу Perl на Покете и если вариант от pal'а не понравится.

Есть пока глюк -- должен бы для всех mht-файлов работать, но тестовый файл, сделанный с помощью Mozilla (unmht), Internet Explorer ( 8 ) и Opera (12) ведет себя по разному: от Internet Explorer открывается идеально, от Mozilla -- открывается, но кроме нужной информации показывает много разного мусора (не мешает особо так как лишь немного в начале и много в конце, но слишком много страниц выходит, в 3 раза больше чем в Internet Explorer). А вот от Opera -- не запускается Sad пока не могу понять почему...

Вот код, состряпанный на скорую руку (зависимость только от стандартного пакета MIME) (под спойлером):

:

Code:
#!/usr/bin/perl

use MIME::Base64;
use MIME::QuotedPrint;

$mhtfile = "test_ie.mht";
$boundary='';
$flagmainfile =0;
$flagready = 0;
$flagemptyline = 0;
$method = '';

open(MHT, $mhtfile) || die "Can't open  $mhtfile: $!";
open(MHT2, '>2'.$mhtfile)  || die "Can't write to 2$mhtfile: $!";

while( $line0 = <MHT> )
{
  $line = $line0;

  if (!($flagmainfile) && ($line =~ /boundary\=/))
  {
    if ($line =~ /boundary\=\"*([^ ]+)\"*$/) { $boundary = $1}
    else {die "Smth wrong with boundary"};
#    print $boundary;
  };

  $flagmainfile=1 if (!($flagmainfile) && $line =~ /Content-Type\: text\/html/);

  if ( !($method) && $line =~ /Content-Transfer-Encoding/)
  {
    $method = 'Q' if ($line =~ /quoted-printable/i);
    $method = 'B' if ($line =~ /base64/i);     
#    print $method;
  };


  if ( $flagmainfile && !($flagemptyline) &&  $line =~ /^$/)
  {
    $flagemptyline = 1; print MHT2 $line0;
  };

  if ( $flagmainfile && $boundary && $line =~ /$boundary/ ) {$flagmainfile=0; $flagready = 1; };

  if ($flagmainfile && $flagemptyline && !($flagready))
  {
    if ($method eq 'Q') {print MHT2 decode_qp($line)};
    if ($method eq 'B') {print MHT2 decode_base64($line)};
  }
  else {print MHT2 $line0};
};

close(MHT);
close(MHT2);



Last edited by transient on 07.01.2013 23:48; edited 1 time in total
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 06.01.2013 23:40    

Antuan wrote:
pal wrote:
fbreader почему-то открывать не захотел.

Какие права устанавливаются на временную папку, может не хватает прав?
На 602-м ни чем не удалось открыть, как будто приложения не видят временную папку.


На 602-м нет программки openbook. Я пробовал размещать временную папку и на /mnt/ext1 - не помогло; значит права ни при чем.
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 07.01.2013 19:07    

pal wrote:
На 602-м нет программки openbook.

Я запускал напрямую, т.е. оставлял только путь к программе.
pal wrote:
Я пробовал размещать временную папку и на /mnt/ext1 - не помогло; значит права ни при чем.

А я кажется понял, передается не имя файла с путем, а только путь /tmp/unmht/html/, вот потому браузер запускается, а другие программы нет. Т.е. ошибка где-то тут:
Code:
html=`$perl $unmht -o "$out" -l "$in"|grep text/html|awk '{print $1}'`

_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 07.01.2013 20:04    

Нет. Таким образом мы извлекаем из mht имя html-файла.
Дальше это имя дописывается к имени временного каталога. Открывать мы пытаемся таки файл с полным путем.
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 07.01.2013 21:00    

pal wrote:
Нет. Таким образом мы извлекаем из mht имя html-файла.
Дальше это имя дописывается к имени временного каталога.

Так вот, имя как раз и не извлекается.
Измени строку:
Code:
echo "html=$html"

на
Code:
echo "html=$html"  > /mnt/ext1/unmht.log.txt

и увидишь сам.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 07.01.2013 21:35    

Quote:
html=`$perl $unmht -o "$out" -l "$in"|grep text/html|awk '{print $1}'`
echo "html=$html"

html=766.html
Quote:
$perl $unmht -o "$out" "$in"
htmlfile="$out/$html"
echo "htmlfile=$htmlfile"

htmlfile=/tmp/unmht/html/766.html

Обижаете Wink
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 07.01.2013 22:58    

pal
Чем сохраняли mht? Я сохраняю их FF дополнением UnMHT.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 07.01.2013 23:37    

На самом деле это прикопано в unmht Sad
Если он не может распарсить .mht - в stdout ничего не выводится

на годном файле строчка
Code:
/ebrmain/bin/fbreader.app "$htmlfile"

тоже работает Wink

mht я нашел в интернете Wink
ftp://ftp.ttn.ru/pub/DISEL-TV/D-Link.mht - оказался годным
ftp://ftp.antivirus.com/china/air_classroom_2011Q1.mht - оказался негодным
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 08.01.2013 00:11    

Проведя дальнейшие опыты с кулридером -- выяснил, что его поддержка mht на Покете довольно мизерна (на Декстопе вроде нормальная была...) и сводится только к отображению основной html-части, все остальные части, вроде файлов css, js, gif, png ,jpg -- игнорятся.

Поэтому с одной стороны мой энтузиазм поугас, с другой -- все же неплохо разобрался с mht, формат очень простой.

По поводу кулридера и "легкой поддержки" поэтому думаю, что если хочется простого пути, то надо "на лету" выдрать html часть и декодировать ее -- т.е. сохранить базовый html во временной директории и дальше по методу pal'a читать чем хочется.

"Выдиральщик" я на основе прошлого своего скрипта написал. Работает в силу своей простоты на ура, пока на декстопе. Дальше ставим Perl на Pocket и пришиваем как pal прописал, думаю вполне сойдет для большинства случаев. Весь код ниже под спойлером:

mht2htm :


Code:
#!/usr/bin/perl

# подгружаем пакеты для декодирования
use MIME::Base64;
use MIME::QuotedPrint;

#$mhtfile = "test.mht";
$mhtfile = shift; # читаем имя нужного файла из аргумента

$boundary=''; # тут будет метка границы между частями
$flagmainfile =0; # флаг, что мы нашли основную часть (не факт, но обычно она первая)
$flagemptyline = 0; # флаг, что мы нашли пустую строку перед телом файла основной части (отсюда будем декодить)
$flagready = 0; # флаг, что мы закончили основную часть (уст, так как дальнейшие части не обрабатываем)
$method = ''; # тут храним тип метода кодирования

open(MHT, $mhtfile) || die "Can't open  $mhtfile: $!"; # читаем mht файл
open(HTM, '>'.$mhtfile.'.htm')  || die "Can't write to htm: $!"; # открываем на запись htm файл

while( $line = <MHT> ) # читаем построчно
{
  if ( !($flagready) && !($flagmainfile) && ($line =~ /boundary\=/) )
  {
    if ($line =~ /boundary\=\"?([^";]+)\"?\;?$/) { $boundary = $1}   # определяем метку границы
    else {die "Smth wrong with boundary"};
#    print $boundary;
  };

  $flagmainfile=1 if ( !($flagready) && !($flagmainfile) && $line =~ /Content-Type\: text\/html/ ); # находим осн часть

  if ( !($method) && $line =~ /Content-Transfer-Encoding/)
  {
    $method = 'Q' if ($line =~ /quoted-printable/i);  # определяем тип кодирования
    $method = 'B' if ($line =~ /base64/i);     
#    print $method;
  };

  if ( !($flagready) && $flagmainfile && !($flagemptyline) &&  $line =~ /^$/)  # находим пустую строку-разделитель, откуда начинаем дкеодирование
  {
    $flagemptyline = 1; # print MHT2 $line0;
  };

  if ( !($flagready) && $flagmainfile && $boundary && $line =~ /$boundary/ )  # если опять встретили метку -- конец
  {
    $flagmainfile=0; $flagready = 1; break;
  };

  if ( !($flagready) && $flagmainfile && $flagemptyline ) # если находимся в файле основной части, декодируем
  {
#    print "!";
    if ($method eq 'Q') {print HTM decode_qp($line)};
    if ($method eq 'B') {print HTM decode_base64($line)};
  };
#  else {print MHT2 $line0};
};

close(MHT);
close(HTM);
print "\nOk, file $mhtfile just converted to $mhtfile.htm\n";



pal
Страшный файл air_classroom_2011Q1.mht мой скрипт сконвертировал Wink
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 08.01.2013 00:59    

Посмотрел я, на чем спотыкается unmht..
1. не учитывается, что поле boundary= может содержать кавычки
Code:
184c184
<firstline> $firstline =~ m!Content-Type: multipart/related;.* boundary=\"?(.*)\"?$!
- исправление
2. считается, что заголовки секций однострочные
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 08.01.2013 01:13    

pal wrote:
На самом деле это прикопано в unmht

Может и так, но нужно ведь что бы скрипт справлялся с любыми файлами, иначе нет в нем особого смысла.
transient wrote:
выяснил, что его поддержка mht на Покете довольно мизерна

В кулридере вообще не заявлена поддержка mht, так что он и не должен их открывать. Скорее всего кулридер с mht обрабатывает как обычный html, при этом конечно же картинки не будут видны и то же самое со стилями.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 08.01.2013 02:41    

pal

2. неа, не всегда:

Code:
Content-Type: multipart/related;
   type="text/html";
   boundary="----=_NextPart_000_0000_01CDEC6B.104203B0"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157


1. еще один косяк у Вас остался, вот смотрите, как делает Mozilla Unmht (да и строк три):

Code:
Content-Type: multipart/related;
   boundary="----=_NextPart_000_0000_40E3C2E5.C765590C";
   type="text/html"

видите, там еще может быть точка с запятой!
Я это вчера прошел...
Wink

Мне показалось так будет лучше:

Code:
if ($line =~ /boundary\=\"?([^";]+)\"?\;?$/) { $boundary = $1}

все границы одинаковы, в общем все равно где ее поймать...

Antuan

Я почему решил начать с кулридера -- на Десктопе под Убунтой, помнится (сейчас давно уже нету его) он вполне корректно открывал mht-файлы. Я проверил на Покете -- частично работает. Как именно -- я уже для себя почти все выяснил и выше написал.

Таким образом, с моей точки зрения -- выдираем основной файл (ну может быть, можно еще прикрутить css, если они в основном файле будут отсутствовать) и смотрим штатным fbreader'ом -- разумеется на лету и прозрачно для юзера (как расписал pal). Для большинства ситуаций вполне хватит. Для полной поддержки -- все более-менее уже pal выписал.
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 08.01.2013 03:05    

У меня на 602-м похоже не работает перл.
Стянул заведомо нормальный D-Link.mht и поменял путь, что бы распаковывало на карту - пусто.
Нужен какой нибудь простенький скрипт на перл, что бы проверить.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 08.01.2013 03:17    

вот:

Code:
print "\nHello world!";
sleep 2;


только запускать из PocketTerm типа так
./perl.app test.pl, ну и для простоты что бы он был в одной директории с интерпретатором.

Я пока не разбирался со сборкой от pal -- возможно у него там что-то хитрее...

Да, для начала просто запустить можно:
./perl.app -v
должен сказать свою версию Smile
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 08.01.2013 03:44    

transient wrote:
Да, для начала просто запустить можно:
./perl.app -v
должен сказать свою версию

Code:
/mnt/ext1/usr/bin/perl -v

В ответ выдается:
Code:
This is perl, v5.10.1 (*) built for arm-linux-gnueabi-thread-multi
(with 59 registered patches, see perl -V for more detail)
......
и т.д.

Вроде как работает, но чего-то видать не хватает.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 08.01.2013 04:00    

ну ответ стандартный...

А чего бы не назвать perl как perl.app (копию сделать) и запустить скрипт-тест выше?
 
View user's profile ^
Libroom Forum IndexPocketBookPocketBook FreeAll times are GMT + 4 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

© Libroom, 2021