【Asciidoctor (adoc)】の使い方〜効率的なドキュメント作成術〜

# はじめに
設計書を作成する際のツールとして**Asciidoctor（adoc）** を紹介します。
私もAsciidoctorを設計書作成の際に利用しています。
Asciidoctorはドキュメントの構造化や見た目のカスタマイズが非常に簡単です。

この記事では、Docker を利用して手軽に環境をセットアップし、Asciidoctorの基本的な使い方と設計書作成で役立つ機能、さらにはHTMLやPDFへの変換までを解説します。

# 完成イメージ

![_Users_kumaishuya_projects_asciidoc_project_sample.html (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/e01c10f4-4b7a-f3fc-8870-9ad833a9f2a5.png)


# Asciidoctorとは？
はじめに、「Asciidoctorはなんぞや！」ということで、説明します。
Asciidoctorは、軽量なマークアップ言語である AsciiDoc の一つです。設計書、仕様書、ブログ記事、チュートリアルなどの技術文書を作成する際に便利で、Markdownに似たシンプルな書式でより高度なフォーマットが簡単に利用できます。

ベンチャー企業で上司から「設計書作っといて！」と条件なしに丸投げされた際には、Asciidoctorを利用すると便利かも知れません。

では、さっそく始めていきます。

# Dockerを使ったAsciidoctor環境の構築

まず、Dockerを使ってAsciidoctorの環境を構築します。Dockerを使うことで、ローカル環境を汚すことなく、すぐにAsciidoctorを使い始めることができます。

### Dockerがまだインストールされていない場合
Dockerをインストールしていない方は、以下の手順に従ってインストールしてください。

#### 1. Dockerのインストール
Dockerをインストールするには、公式サイトからインストーラーをダウンロードして実行します
[Docker Desktop ダウンロードページ](https://www.docker.com/ja-jp/products/docker-desktop/)

自分のOS（Windows、macOS、Linux）に対応するバージョンを選び、インストールファイルをダウンロードします。
ダウンロードしたインストーラーを実行し、指示に従ってインストールします。

#### 2. インストール確認

インストールが完了したら、ターミナルやコマンドプロンプトを開き、次のコマンドを実行してDockerが正しくインストールされたか確認します。

```:ターミナル
% docker --version
```
```:例
Docker version 24.0.7, build afdd53b
```
これにより、インストールされたDockerのバージョンが表示されればインストールは完了です。

### Dockerインストール後

### 1. Dockerイメージの準備

Asciidoctorの公式Dockerイメージを使用します。
以下のコマンドを実行することで、Dockerイメージを取得します。

```:ターミナル
% docker pull asciidoctor/docker-asciidoctor
```

### 2. プロジェクトディレクトリの作成

次に、プロジェクトディレクトリを作成し、その中に書きたい .adoc ファイルを作成します。

```bash:ターミナル
% mkdir asciidoc_project
% cd asciidoc_project
% touch sample.adoc
```
これでasciidoc_projectフォルダ内にsample.adocが格納されていればOKです。

### 3. ファイル内に簡単な文書を記述
作成した sample.adocに、簡単な文書を記述します。

```:sample.adoc
= Asciidoctor サンプル
:doctype: article
:date: 20xx-xx-xx
:toc: left![_Users_kumaishuya_projects_asciidoc_project_sample.html (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/46347152-cfd7-b2a0-d717-1abbb22a69d9.png)

:toclevels: 2

== はじめに

これはAsciidoctorのサンプルです。

== セクション

ここに本文を記述します。

=== サブセクション

さらに詳細な内容を書くことができます。
```

### 4. AsciidoctorでHTMLを生成
Dockerを使って、sample.adoc をHTMLファイルに変換します。以下のコマンドを実行してください。

```:ターミナル
% docker run --rm -v $(pwd):/documents asciidoctor/docker-asciidoctor asciidoctor sample.adoc
```
上記のコマンドを実行すると、同じディレクトリに sample.html が生成されます。

### 5. HTMLファイルを確認
生成された sample.html ファイルをブラウザで開きます。
以下のように表示されていればOKです。

![スクリーンショット 2024-10-12 17.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/faa10850-40fc-f94a-631c-0b079a2632ec.png)

（`:toc: left_`を記述したことで、左側に目次が追加されました。ここから各トピックに飛べます。）

これで、簡単にAsciidoctorでドキュメントを作成し、HTMLに変換できました！


ここからはAsciidoctorの基本的な書き方について話します。

# Asciidoctorの基本的な書き方
### 見出し
Asciidoctorでは、見出しは等号（`=`）で記述します。等号の数が増えるほど、見出しの階層が下がります。

```adoc
= 見出し1
== 見出し2
=== 見出し3
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/66fcc805-c15d-c8a9-a699-ab82db5cf739.png" width="300">


### リストの作成
順序付きリストや順序なしリストも簡単に作成できます。以下のように記述します。

```adoc
* 順序なしリストのアイテム
. 順序付きリストのアイテム
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/f2470714-9fac-7848-d139-9d0d71ea1ff0.png" width="300">


### テキストの装飾
テキストを太字にしたり、斜体にしたり、コードを挿入するのも簡単です。

```adoc
*斜体*  

**太字** 

`インラインコード`
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/4946a650-de53-f6de-c5c0-cd69b87aac7d.png" width="200">


### リンクと画像の挿入
リンクや画像もシンプルに挿入可能です。リンクのテキストや画像のキャプションも簡単に設定できます。

```adoc
link:https://qiita.com/[Qiitaへのリンク]  
image::example.jpg[これはサンプル画像です]
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/6a215992-a168-e055-9a4f-692152dde4a7.png" width="300">

# 設計書作成での具体的な活用
基本的な書き方は抑えたので、ここからは細かい書き方について記載します。

### 表の作成

表を使った要件の整理や、項目間の関係を視覚的に表現することができます。設計書では、要件定義や機能一覧を表で管理するケースが多いので、Asciidoctorの表機能を使うと便利です。


Asciidoctorは、表は次のように記述します。
`|===` で表の開始と終了を表し、セルは `|` で区切ります。

```
|===
|機能  |説明  |優先度
|ログイン  |ユーザー認証  |高
|データ検索  |ユーザーがデータを検索できる  |中
|===
```
![スクリーンショット 2024-10-12 18.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/0ad2d877-9020-dc05-3cb0-98b181e64510.png)

この書き方で、シンプルな表が作成できます。


## HTMLやPDFへの変換
作成したAsciidoctorファイルを簡単にHTMLやPDFに変換できます。特に設計書をPDF形式で納品する場合にも便利です。

### HTMLの生成
以下のコマンドで.adocファイルをHTML形式に変換します。

```
asciidoctor <adocファイル名>

(例)
asciidoctor sample.adoc
```

### PDFの生成
PDFとして出力したい場合は、asciidoctor-pdfをインストールし、以下のコマンドを実行します。

```
gem install asciidoctor-pdf
asciidoctor-pdf yourfile.adoc
```

## 高度な機能
### コードブロックの挿入
プログラムコードをドキュメントに含める場合、シンタックスハイライト付きで表示することができます。例えば、adocの設定を加え、Pythonコードを次のように書きます。

.adoc ファイルの冒頭に以下の行を追加して、ハイライトを指定します。
```:sample.adoc
:source-highlighter: coderay
```

```　python:sample.adoc
* 「｀」は半角の「`」に直して利用してください。

｀｀｀
def hello():
    print("こんにちは、世界！")
｀｀｀
```

ブラウザで確認すると↓こんな感じで表示されます。

![スクリーンショット 2024-11-03 19.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/f7c9f697-b777-7ea1-5865-0d04c15827f3.png)

## 図の作成

### システム構成図
```
== システム構成図

[plantuml, format="svg"]
----
package "Webアプリケーション" {
  [ブラウザ] --> [Webサーバー] : リクエスト
  [Webサーバー] --> [アプリケーションサーバー] : APIコール
  [アプリケーションサーバー] --> [データベース] : データの読み書き
}

package "外部サービス" {
  [アプリケーションサーバー] --> [認証サービス] : 認証要求
  [認証サービス] --> [アプリケーションサーバー] : 認証トークン
}
----
```

![スクリーンショット 2024-11-03 19.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/23959821-20ca-cc41-00f3-a42d08b24eb7.png)


### 認証フロー
```
== 認証フロー

ユーザーがログインすると、アプリケーションサーバーを通じて外部の認証サービスに認証要求を送信し、認証トークンを取得します。このトークンを使用して、セッションが維持されます。

[plantuml, format="svg"]
----
group テナントの認証
  クライアント -> アプリケーションサーバー : 認証リクエスト
  アプリケーションサーバー -> 認証サービス : 認証情報
  認証サービス --> アプリケーションサーバー : 認証トークン
  アプリケーションサーバー --> クライアント : 認証トークン
end
----
```

![スクリーンショット 2024-11-03 19.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/662768e6-c051-d62a-c51c-3cf8e3252dda.png)


### データベース設計

```
== データベース設計

### テーブル一覧

|===
|テーブル名 |説明 |カラム

|users
|ユーザー情報を管理
|id, username, email, password_hash, role

|items
|ユーザーが登録したデータ
|id, user_id, item_name, item_description, created_at, updated_at
|===

### ER図

[plantuml, format="svg"]
----
entity "users" {
  * id : INT
  * username : VARCHAR
  * email : VARCHAR
  * password_hash : VARCHAR
  * role : VARCHAR
}

entity "items" {
  * id : INT
  * user_id : INT
  * item_name : VARCHAR
  * item_description : TEXT
  * created_at : DATETIME
  * updated_at : DATETIME
}

users ||--o{ items : "user_id"
----
```

![スクリーンショット 2024-11-03 19.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/8972a18b-5d94-219f-dc69-183e123c23d7.png)

こんな感じで図も作成できます！！！

# 最後に
今回は、Asciidoctorの基本的な使い方と設計書作成で役立つ機能を説明しました。Asciidoctorを活用することで、ドキュメントや設計書を効率的かつ美しく作成できるようになります。是非この機会に試してみてください！

今回紹介したはAsciidoctorの機能はまだほんの一部です。
さらに詳しく知りたい方は、Asciidoctorの公式ドキュメントを覗いてみてください。
https://asciidoctor.org/docs/