СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Git + book = GitBook в черновиках Tutorial

Приветствую всех Хабражителей!

Сегодня я хочу рассказать вам об одном инструменте, который мне очень, очень понравился. Если вы планируете создавать веб-версии ваших книг, документации и тому подобных вещей — этот инструмент достоин вашего внимания.

Предыстория


Давным-давно (кажется, в прошлом месяце) я рассказывал о своей книге. И многие из моих читателей пожелали видеть её в HTML-формате. Признаюсь, вначале я сопротивлялся этой идее, но потом, поразмыслив, понял, что веб-версия книги действительно была бы удобной. Сказано — сделано. Вот, собственно, и вся предыстория.

Как я хотел сделать вначале


Ну, думаю, создам отдельную страницу на сайте, скопирую туда текст, причешу его — и готово. К счастью, вовремя остановился… Как представил себе поддержание/согласование нескольких вариантов книги (HTML, PDF и электронно-читальные форматы) — так и стало мне нехорошо. Настолько нехорошо, что от такого сценария я отказался немедленно.

Как я хотел сделать потом


Уже третью неделю активно идёт перевод моей книги на великий и могучий Шекспировский, и вот в процессе работы над этим переводом я впервые услышал про формат Markdown. Кто не знает — это простой формат разметки текста (легче LaTeX). А вся вкуснота в том, что размеченный таким образом текст может быть сконвертирован в документы разных форматов, и в первую очередь в HTML. Кстати, на GitHub этот формат принят за основной.

Посмотрел я на этот Markdown — понравился: просто, лаконично. Кроме того, я услышал про утилиту pandoc, универсальный конвертор документов, умеющий, помимо всего прочего, превращать Markdown в HTML.

Ну, думаю, оно! Создал .md-файл, попробовал сконвертировать. В целом вышло аккуратно, но слишком примитивно. Да, можно было бы прикрутить свой CSS, но хотелось чего-нибудь готовенького. В общем, понял: нет, это не оно.

Как я сделал


Помог мне опять-таки один из моих читателей. В письме по поводу пожелания веб-версии книги он вскользь упомянул о GitBook. Я впервые слышал об этой штуковине (как выяснилось позже, этот проект очень молодой, существует менее двух недель), поэтому решил поглядеть. И вот что я увидел:

Write your books and courses using Markdown, GitBook will convert it to a complete static website.

Хм, подумал я, звучит вкусно. Ещё вкуснее стало, когда я увидел демонстрацию: gitbookio.github.io/javascript. Вот как это выглядит:

image

Очень приятный вид, удобство навигации, мобильная адаптация из коробки. И всё это делается одной-единственной командой из набора простых .md-файлов! Это именно то, что я искал. Собственно, об этом инструменте и пойдёт речь далее.

Устанавливаем


На главной странице GitBook сказано, что устанавливается утилита gitbook так:

$ npm install gitbook -g

Мне это ни о чём не сказало, поэтому начал искать. Первым делом я выяснил, что npm — это Node Packaged Modules. Признаюсь, это мне тоже мало о чём сказало, но господин Гугл привёл меня к Node.js. Как выяснилось, стоит установить себе эту Node.js, и npm автоматически установится вместе с ним. В общем, установил. Далее выполнил ту самую команду:

$ npm install gitbook -g

и gitbook был уже у меня.

Готовим репозиторий


Прежде чем строить веб-книгу, необходимо подготовить для неё дом. Ну а раз сама книга будет жить на GitHub, домом для веб-версии станет GitHub-страница. Кто не в курсе — GitHub предлагает своим пользователям бесплатный сервис для создания сайтов, крепко связанных с их репозиториями. Вот суть этого сервиса:

Websites for you and your projects. Hosted directly from your GitHub repository. Just edit, push, and your changes are live.

Пустой репозиторий для книги у меня уже был, так что осталось лишь настроить его. Настройка оказалась предельно простой: необходимо создать в репозитории пустую ветку по имени gh-pages, что-то в неё положить, закоммитить-запушить — и вот уже нас встречает ваша GitHub-страница. Однако, как выяснилось, делать всё это следует в точности как описано здесь. В общем, сделал — и веб-страница уже тут: denisshevchenko.github.io/ohaskell/index.html. Обращаю ваше внимание: после первого пуша в ветку gh-pages страница становится доступной не мгновенно, а через несколько минут.

Строим веб-книгу


Итак, исходное сырьё — это .md-файлы. Синтаксис Markdown-формата описывать не стану, ибо раз и два. Обрадовался я и, сломя голову, ринулся в бой: радостно создав .md-варианты первых четырёх вступительных глав, кинул их в каталог, попробовал собрать — и разумеется, ничего не получилось. Как выяснилось, нельзя скормить утилите gitbook кучу .md-файлов. Необходима структура. Поэтому в ветке master я создал следующее:

README.md    # Титульный лист книги
SUMMARY.md   # Описание структуры книги
intro/
    README.md   # Введение к вступительной части книги
    for-whom.md
    what-for.md
    who.md
    why.md

Идея именно такая: в ветке master будет лежать Markdown-версия книги, а в ветке gh-pages — веб-версия. Обращаю ваше внимание: файлы README.md и SUMMARY.md необходимы. В первом из них пишем некое общее введение, которое станет титульной веб-страницей книги. А вот в SUMMARY.md необходимо описать структуру книги. В моём случае это выглядит так:

### Summary

* [Лирическое вступление](intro/README.md)
  * [Кто](intro/who.md)
  * [Почему](intro/why.md)
  * [Зачем](intro/what-for.md)
  * [Для кого](intro/for-whom.md)

Я отразил иерархию страниц в стиле классического Markdown-оглавления. Разумеется, файлы, не указанные в SUMMARY.md, частью веб-книги не станут.

Строим


Настало время строительства:

$ gitbook build ./ --github=denisshevchenko/ohaskell --title="О Haskell по-человечески"
Starting build ...
Successfuly built !

Готово. Кстати, обращаю ваше внимание на параметр --github=denisshevchenko/ohaskell. Здесь denisshevchenko — имя моего профиля на GitHub, а ohaskell — имя репозитория.

В итоге в корне репозитория появилась папка _book, а в ней — о чудо! — лежал готовый сайтик:

_book/
    README.html   # Титульный лист книги
    SUMMARY.md
    gitbook/
        app.js
        fonts/
        images/
        jsrepl/
        index.html   # Стартовая страница сайта
        intro/   # Сгенерированные страницы первой части книги
            README.html
            for-whom.html
            what-for.html
            who.html
            why.html

Коммитим это хозяйство и пушим в ветку master.

Новоселье


Настало время поселить веб-книгу в её уютный дом:

$ git checkout gh-pages
$ git checkout master -- _book
$ git mv _book/* .

Первой командой переходим в ветку gh-pages. Второй командой забираем из ветки master тот самый каталог _book, созданный gitbook-ом. Третьей командой вытаскиваем содержимое этого каталога в корень ветки gh-pages. К сожалению, я так и не выяснил, как забрать из другой ветки лишь содержимое каталога, а не весь каталог. Завершаем:

$ git add .
$ git commit -a -m "FIrst init for real book."
$ git push origin gh-pages


It works!


Вот, собственно, и всё. Идём по адресу denisshevchenko.github.io/ohaskell/index.html — и вот она:

image

Обращаю внимание на автоматически создаваемые ссылки вверху страницы: ведут на страницу автора репозитория, на сам репозиторий, ну и социальные ссылки, куда ж без них-то.

Не только English


На данный момент разработка GitBook ведётся семимильными шагами, и буквально на днях была добавлена одна очень полезная возможность. Речь идёт о многоязычных книгах, а поскольку моя книга как раз и пишется на двух языках, я не мог пройти мимо такой фичи. Делает всё предельно просто.

Создаю в корне репозитория (ветка master) каталоги ru и en. Затем просто переношу в каждый из них все .md-файлы, относящиеся к двум вариантам книги. Причём, что удобно, в сами эти файлы, равно как и в их структуру, я не вношу никаких изменений, просто переношу.

Затем в корне репозитория создаю файл LANGS.md и пишу в него следующее:

* [По-русски](ru/)
* [in English](en/)

То есть обыкновенный Markdown-список с языковыми ссылками, каждая из которых ведёт внутрь своего языкового каталога.

Всё. Теперь собираю книгу с помощью команды gitbook точно так же, как было описано выше. Далее, как обычно, переношу это хозяйство в ветку gh-pages, коммичу-пушу — и в результате, при заходе на страницу, вижу вот это:

image

Соответственно, вот русская версия:

image

а вот и английская:

image

Кстати, обратите внимание на улучшенный вид. Благодаря обновлению gitbook с версии 0.1.0 до версии 0.1.2:
— появилась листалка страниц в обе стороны (привязанная к клавишам Влево-Вправо),
— появился поиск в верхнем левом углу.

Кроме того, небольшие изменения, внесённые мною в шаблон темы:
— улучшили шрифт (спасибо Google Fonts),
— расположили заголовки по центру,
— выровнили текст по ширине (всё-таки для книги так лучше).

Вот и всё, друзья. На мой взгляд, GitBook заслуживает пристального внимания. Определённо, у этого инструмента есть большое будущее.

Альтернативы


GitBook великолепен, но есть и другие.

MkDocs. Почти аналог GitBook, с той лишь разнице, что работает не на JS, а на Python. Концептуально всё то же самое: собираем .md-файлы по структуре книги, скармливаем это утилите mkdocs — и готово. Преимущество перед GitBook вижу одно: есть готовый набор тем для создаваемого сайта.

Sphinx. Питоновский инструмент, использует собственный формат разметки (не Markdown). На выходе, помимо HTML, могут быть документы LaTeX, ePub).

Так что выбор есть. Как верно заметили ниже, эти инструменты страшно недооценённые.

комментарии (23)

+4
denisshevchenko ,  

Кстати, возвращаясь к конвертеру pandoc. Выяснилось, что он умеет весьма неплохо превращать Markdown в электронно-читальные форматы, в частности, в epub.

–1
ainu ,  

Да, только придется разбираться в куче расширений для latex. Особенно если надо будет управлять отступами, страницами, полями, интервалом.

+1
denisshevchenko ,  

LaTeX? Нет, LaTeX нужен для создания PDF, а я говорил о epub.

+1
SamDark ,  

Для epub там есть спецсинтаксис, который можно прямо в markdown напихать. Остальными конвертерами он будет игнорироваться.

0
ilammy ,  

А я делал сайт с книгой на github.io руками :(

+5
moigagoo ,  

Если интересны альтернативы:

— ReST + Sphinx (http://docutils.sourceforge.net/rst.html, sphinx-doc.org/). Мощнее, чем Маркдаун, делает HTML, PDF, ePub, LaTeX из файлов .rst — это такой формат, очень похожий на Маркдаун, но более расширяемый и мощный. Например, если у вас есть таблицы, то с MD вы просто умрете, а в ReST есть list tables.

— MkDocs (http://www.mkdocs.org/). Очень прикольный генератор документации на MD с приятными мелочами вроде автопересборки при изменении кода и интеграции с GitHub Pages (загрузка одной командой).

Лично я остановился на ReST + Sphinx, потому что документация получается поддерживаемой и конвертируемой, плюс сами язык и сборщик достаточно мощные.

Кроме того, есть прекрасный бесплатный сервис readthedocs.org, там можно привязать репозиторий, и ваши доки будут пересобираться на каждый пуш, сразу по всех форматах.

0
denisshevchenko ,  

Ого, не знал! Спасибо большое за ссылки.

0
moigagoo ,  

Пожалуйста!

Если вдруг нужна помощь со Сфинксом и РеСТ — пишите. На мой взгляд, инструменты страшно недооцененные.

+1
utkorose ,  

добавьте в пост, пожалуйста

0
denisshevchenko ,   * (был изменён)

Лично мне из этих альтернатив больше всех приглянулся www.mkdocs.org. Хорошо, что появляются такие полезные инструменты. Эх, вот бы раньше, годочков пять назад…

+1
moigagoo ,  

Кстати, как раз на прошлой неделе имел удачу слушать доклад и лично поговорить с самим разработчиком MkDocs (Том Кристи, он же автор Django REST Framework). Рассказал ему про проблему с таблицами, создал ишью на ГитХабе — github.com/tomchristie/mkdocs/issues/62. Так что если вы заинтересованы в расширении возможностей инструмента — добро пожаловать в обсуждение :-)

0
Useless_guy ,  

Блин, хотел почитать, но на WP текст не скроллится.

0
Funcraft ,   * (был изменён)

Конечно, любопытно, но всё-таки не могу я привыкнуть к MD.

+1
denisshevchenko ,   * (был изменён)

А мне очень понравился. После LaTeX — вообще детский сад. А учитывая, что из этого MD можно одной командой делать такую красоту — это же великолепно!

0
icc ,  

Еще бы в Latex была бы встроена система контроля версия.

+2
KrD ,  

Боже, но зачем? Звучит равносильно «ещё бы в LaTeX был бы встроен медиацентр».

+2
ltwood ,  

Вы издеваетесь? Это звучит нак «если бы в gcc была встроена система контроля версий». Исходники в LaTeX — это обычные текстовые файлы и каждый может использовать ту систему контроля версий, которая ему нравится. Например, у меня много лет все исходники на LaTeX лежат в hg на bitbucket.

0
powerman ,  

Ещё из альтернатив — Asciidoc. Значительно мощнее markdown, конвертируется во что угодно, и почти такой же простой, как markdown.

+1
macik_spb ,  

В приведенном примере (http://gitbookio.github.io/javascript) реализован поиск по тексту (иконка наверху слева).
Подскажите за счет чего это реализовано? В книге автора этой статьи такой фишки нет.

0
denisshevchenko ,  

Признаться, пока не знаю. Я ведь только начал разбираться. Разумеется, когда все главы книги будут переведены в Markdown-формат, я обязательно выясню, потому что поиск по книге — это очень удобно.

0
denisshevchenko ,  

Впрочем, как я выяснил только что, на скриншоте их книги по JS, сделанном ещё несколько дней назад, поиска ещё не было. Значит, он появился буквально вчера. Если посмотреть на их GitHub-репозиторий, они обновляют gitbook буквально несколько раз в день! То есть работа у них кипит.

0
denisshevchenko ,  

Я немного дописал статью. Буквально вчера были добавлены новые фичи. Рекомендую к ознакомлению, начиная с заголовка «Не только English».

0
Dmi3yy ,  

Рекомендую так же обратить внимание на этот проект:
github.com/justinwalsh/daux.io