?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

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


Jun. 14th, 2018 07:07 pm Как починить экспорт в 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, и понимаю, что это дерьмовый формат, который сплошь дырявый и никто не хочет его поддерживать.

Leave a commentPrevious Entry Share Next Entry