Мне нравится писать на 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. Дело сделано.

Установка WinSCP


Скачиваем файл .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 эту кнопку

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


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


Если открыть файл прямо в 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 на тэги и подставляет тэги вместо гиперссылок и картинок. Поскольку это все, что мне нужно было от этого конвертера при написании этой статьи.
Файл шаблона выложен тут и доступен всем желающим для совершенствования, но я не могу гарантировать продолжения этого проекта, его поддержки, его качества, его патентной чистоты и вечной жизни этой ссылки.

Комментарии (14)


  1. EminH
    07.01.2016 12:33

    То есть картинки в статье будут подгружаться со стороннего сайта, указанного в Const URL?


  1. Indemsys
    07.01.2016 12:45
    +1

    Да. А именно с адреса: URL + WEBPATH
    Geektime очень быстро их скачивает и подставляет свои, но иногда стоит убедится и еще раз открыть статью в режиме редактирования.


  1. mr_dein0s
    07.01.2016 13:02

    По поводу загрузки на хабрасторадж — можно глянуть тут http://habrahabr.ru/post/214347.
    Правда все еще не совсем удобно, т.к. надо дергать значение habrastorage_sid из куки. И полноценно и безкостыльно автоматизировать данное действие у меня пока не вышло.

    з.ы. Эхх, вменяемую апишечку бы...


    1. Indemsys
      07.01.2016 13:19

      А в чем вы редактируете статьи?

      Уже ищу как прочитать cookie на VBA


      1. mr_dein0s
        07.01.2016 13:22

        Стараюсь не привязываться к платформам, так что в Atom-е.


        1. Indemsys
          07.01.2016 13:27

          В смысле atom.io?
          Т.е. статьи без иллюстраций?


          1. mr_dein0s
            07.01.2016 13:30

            Да, он самый.
            Предпросмотр html никто не отменял :)

            Специфичные теги (аля вставки твиттов, ютубов, хабракатов и прочего) смотрю уже в окне редактирования.


            1. Indemsys
              07.01.2016 13:37

              Т.е. пишите тэги картинок, а потом включаете просмотр как HTML из этого редактора?
              Или я что то не догоняю.
              В окно редактора atom можно вставить картинку в стиле drag-and-drop?


              1. mr_dein0s
                07.01.2016 13:42

                Т.е. пишите тэги картинок, а потом включаете просмотр как HTML из этого редактора?

                Все верно. Весь текст сразу оформляю с тегами (в т.ч. и изображения) — автокомплит и сниппеты позволяют это делать безболезненно.


                1. Indemsys
                  07.01.2016 13:49

                  Понятно. Интересный способ.


  1. Rockerman
    07.01.2016 18:57
    -2

    Пишу в google doc, потом после окончательной проверки копирую в черновики geektimes. Вставляю картинки через habrastoreage и проблем не возникает…


  1. shuvaevgl
    08.01.2016 18:32
    +1

    Фишка habrastorage в том, чтобы исчезнувшая со стороннего ресурса фотка не исчезала из статьи. То есть залили на хранилище хабра и не беспокоитесь, что через N лет картинки исчезнут. Я с определенного момента начал даже сохранять картинки со сторонних сайтов и заливать в хранилище, если они мне нужны для оформления.


    1. Indemsys
      08.01.2016 18:47
      +1

      Нет, фишка habrastorage в том что он САМ заливает фотки.
      Невозможно в Geektimes запостить фотку и чтобы habrastorage показывал ее по оригинальной ссылке. Он ее сразу же перезаливает к себе.
      На этом технология и построена.
      Разные статьи заливают все в фотки с одними и теми же названиями, а habrastorage перезаливает и дает им всем уникальные названия и не остается следов где картинки были раньше.
      Но не факт, что через некоторое время habrastorage не поменяет все ссылки в статьях, так что на постоянство ссылок на habrastorage я бы не надеялся.


      1. shuvaevgl
        08.01.2016 18:49

        Тогда это просто шикарно! Изучу детальнее, так как сам частенько пишу