morfizm (morfizm) wrote,
morfizm
morfizm

Category:

Как починить экспорт в MHT из OneNote, чтобы он открывался в Хроме?

Интересно, хоть одному человеку кроме меня это нужно?

Написал код, который чинит.
Оказалось, что там две проблемы:

1. Одна это UTF-8 символы, не смотря на "Content-Transfer-Encoding: quoted-printable". Есть подозрение, что это из-за "Русской" дефолтной кодовой страницы в винде: может, поэтому OneNote думает, что русское подмножество UTF-а можно считать printable. В любом случае, RTFM. В RFC написано чёрным по белому про 7-битный ASCII, причём только про его небольшое подмножество. Всё остальное нужно quote'ить. Хром относительно недавно заменил парсер на менее "прощающий" и показывает полный бред, когда пытаешься в нём открыть MHT-файл, созданный в OneNote. Но он в своём праве.

2. Вторая это то, что Content-Location всех MIME parts начинается с "file:///C:/". Несмотря на то, что никто по этим адресам не ходят, они условные, чтобы матчить разные части из multi-part MIME, Хром, по всей вероятности, режет их как потенциально опасные попытки доступа к локальной файловой системе. Если заменить все префиксы в Content-Location на куда более невинный http://localhost/file/C/, то всё работает.

Предыстория. Некоторое время назад Хром перестал правильно показывать мои MHT-файлы. Примерно в то же время FireFox перестал поддерживать Mozilla Archive Format plugin (что отрезало у него как сохранение MHT-файлов, так и отображение их). Оставался IE. Но: с переходом Windows 10 этот IE + Edge настолько навязчиво были встроены везде где можно, что я сделал какое-то действие, чтобы IE перестал запускаться вовсе. Убить Edge у меня не получилось, а вот IE я убил. При этом Edge не поддерживает MHT, а IE - последний, кто поддерживал - больше не запускается на моей домашней машине. Остался только "Preview Pane" в Explorer'е, но с ней есть свои проблемы, например, она не даёт ссылки кликать.

Написал код на Scala, вышло очень компактненько. Заюзал javax.mail.* (из "com.sun.mail" % "mailapi" % "1.6.1"). Первая проблема решается, если насильно заставить MimeMessage сериализовать свой content снова (s = part.getContent... part.setContent(s, part.getContentType)), плюс рекурсивно делать это для multi-parts. Вторая проблема решается, если заменить префиксы во всех "Content-Location" хэдерах, тоже рекурсивно по multi-parts.

Похоже пора писать софт, который будет "ухаживать" за файловым архивом, искать в нём разные несовместимые косяки в разных типах файлов, и чинить их. Иначе файлы будут постепенно умирать, и потом фиг починишь. Кстати, вопрос к публике - не подскажет ли кто хорошего архивного формата, аналогичного MHT, но задуманного как архивный и включающего в себя ренденринг? PDF не очень подходит, т.к. PDF теряет информацию о структуре (нельзя скопировать rich text в Word/OneNote/etc), и PDF разбивает на страницы, у которых есть высота и ширина (а web-страница это принципиально безразмерная штука, может быть очень широкой, со скроллом, и очень длинной, с вертикальным скроллом). Я раньше думал, что MHT это как раз нужный формат для "архивного сохранения веб-страниц и OneNote заметок на будущее". Но сейчас я почитал всякие RFCs и discussion threads, и понимаю, что это дерьмовый формат, который сплошь дырявый и никто не хочет его поддерживать.
Tags: 1, polls questions and social games, software development
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments