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

С 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

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

Шероховатость


Единственная шероховатость — английские названия в именах ссылок и на больших зелёных кнопках перехода. Всё-таки если книга на русском, хочется видеть на русском всё. Очевидно, можно как-то влезть в исходники gitbook-а и поправить. Нужно будет изучить этот вопрос.

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

комментарии (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