Автоматизация переноса статей из Microsoft Word в Geektimes

8d9304b30d3eb5b1020f0ac76816be3f.png
Мне нравится писать на Geektimes, но есть одно неудобство. Это необходимость использования нестандартной разметки в стиле хабрахабр и ручной перенос картинок на habrastorage.org. Я пишу статьи в MS Word под Windows. Честно потратил около часа чтобы найти готовые решения данной проблемы. Лучшее из найденного был анализ API habrastorage для автоматизации загрузки картинок, но похоже устаревшее. Было упоминание некоего конвертера, но с неработающей ссылкой.


Суть предлагаемой автоматизации в том, чтобы одним нажатием кнопки в Word получить текст готовый к копированию в окно редактора Geektimes. А после копирования чтобы там же автоматически появились картинки.

Технология очень простая. MS Word, как известно, может содержать встроенный программный код на языке Visual Basic. Это специальное наречие Visual Basic называемое VBA (Visual Basic for Applications). На VBA можно писать достаточно сложные сценарии по преобразованию документов в Word-е. Процедуры, написанные на VBA, называют макросами. Макросы в Word можно вызывать явно из специального меню, а можно назначить вызов их исполнения определенной кнопке на инструментальной панели.
Картинки же Geektimes сам перекачает к себе. Чтобы ему было откуда перекачивать надо картинки где-то разместить в интернете. Чтобы не занимать свое время освоением и анализом различных API для бесплатных хостингов картинок вроде photos.google.com я решил обратится к старому доброму FTP. Мы приобретаем или каким-либо образом получаем услугу хостинга сайта с закачкой контента по FTP. Сам MS Word VBA не имеет средств работы по протоколу FTP, но он отлично взаимодействует с COM объектами (т.е. специальными dll файлами). Для работы по FTP был использован COM модуль из проекта WinSCP.
Написанный мной VBA макрос сначала заменяет заданные стили документа Word на разметку хабрахабр, потом конвертирует документ Word в документ HTML. Само HTML представление нам не нужно. В результате конвертирования Word создает поддиректорию со всеми картинками из документа в формате .png. Картинки оптом переносятся на заданный FTP сервер. После этого макрос удаляет картинки в документе и подставляет на их место ссылки на сайт куда только что были загружены эти картинки. Остается в окне документа Word выделить весь текст и скопировать его в окно редактора в Geektimes. Нажать кнопку в Geektimes чтобы сохранить в черновик. Потом снова нажать на редактирование и убедится, что Geektimes уже перекачал картинки и заменил их на ссылки на habrastorage. Дело сделано.


Скачиваем файл .NET assembly / COM library и распаковываем в доступную директорию.
В этой директории запускаем командную строку: %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe WinSCPnet.dll /codebase /tlb: WinSCPnet64.tlb
Все.
Чтобы упростить дело, был создан файл шаблона Статья_GT.dotm, содержащий необходимый макрос VBA и указатель на подключение к объекту WinSCP.
Чтобы посмотреть макрос и проверить работоспособность подключения объекта WinSCP надо после открытия файла шаблона нажать на панели инструментов Word эту кнопкуc700c11f58241461cff62c14437e0297.png

и в ней выбрать View Macros, потом Edit. Должно появится окно такого вида:
e99647b05794a7fb9307f35003057190.png

В этом окне в меню Tools→References открывается такой диалог. В нем должна быть отмечена строчка с WinSCP.
7e47ea9911ca243573a700aca2fbb2ea.png

Если открыть файл прямо в Google, то откроется пустой лист. Это правильно, шаблон пустой. В нем только стиль Normal и стиль Heading 1 напоминают стиль хабра. Писать текст надо самому.
Макрос в шаблоне перед применением надо скорректировать. В начале макроса находится такой блок

Const TMPNAME = "TMP"                    ' Имя временного файла в который будет конвертирован документ
Const URL = "http://www.мойсайт.ru"
Const FTPPATH = "/public_html/imgs/"     ' путь к папке с картинками при загрузке по FTP, написать правильный
Const WEBPATH = "/imgs/"                 ' путь к картинкам при просмотре в браузере, написать правильный
Const HOSTNMAE = "ftp.мойфтпсервер.ru"   ' ввести правильный адрес FTP сервера
Const USERNAME = "мой логин"             ' ввести правильное имя пользователя на FTP сервере
Const PASSWORD = "мой пароль"            ' ввести правильный пароль


Надо открыть файл как шаблон в Word-е, ввести правильные параметры и сохранить как шаблон.
Потом можно щелкать на шаблон и писать статью. Сохранить статью и вызвать выполнение макроса ConvertToHabr.
Если загрузка картинок прошла нормально об этом будет написано в строке состояния в окне Word.
Начальный документ закроется, на его месте появится сконвертированный текст.
Это не полнофункциональный конвертер. Сейчас он только заменяет стили шрифтов Bold и Italic на тэги хабра, меняет стили Heading 1…5 на тэги и подставляет тэги вместо гиперссылок и картинок. Поскольку это все, что мне нужно было от этого конвертера при написании этой статьи.
Файл шаблона выложен тут и доступен всем желающим для совершенствования, но я не могу гарантировать продолжения этого проекта, его поддержки, его качества, его патентной чистоты и вечной жизни этой ссылки.

© Geektimes