社内ブログ用のMarkdown to HTML変換ツールの作成

## はじめに

社内ブログを運営する上で、エンジニアにとってMarkdownは記事を書くのに便利な記法です。しかし、Markdownをそのまま公開することはできないため、HTMLに変換する必要があります。そこで、Markdownファイルを簡単にHTMLに変換するPythonツールを作成することにしました。

## GitHub

https://github.com/koinunopochi/convert_markdown_into_html?tab=readme-ov-file

## 簡単な動作サンプル

```md
# sample-1

これはサンプルです

## sample h2
    
    ```bash
    # これはサンプルです
    date
    # これはサンプルです
    make install
    ```

### これはサンプルです

:::note info
インフォメーション
:::

:::note warn
ワーニング
:::

:::note alert
アラート
:::
```

このような状態のファイルが、次のような構造で存在している場合
```bash
sample
│  .markdownignore
│  サンプル_2.md
│  
└─適当なディレクトリ
        ignore.md
        sample_1.md
```
次のようにコマンドを打ちます

```sh
python .\main.py .\sample\ .\sample\public_sample --anchor-links
```

作成結果は次のようになります

```bash
sample
│  .markdownignore
│  サンプル_2.md
│
├─public_sample
│  │  ignore.html
│  │  index.html
│  │  sample_1.html
│  │  サンプル_2.html
│  │
│  ├─css
│  │      base.css
│  │      pygments.css
│  │
│  └─icon
│          alert.svg
│          info.svg
│          warn.svg
│
└─適当なディレクトリ
        ignore.md
        sample_1.md
```
sample_1.htmlは次のような具合になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/eb7147e6-9903-278d-24a4-c077f977618d.png)

また、自動でindex.htmlも作成されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/83896684-0839-ef1a-7787-f90fc692ee4e.png)

こちらにサンプルのリンクを置いておくのでソースコードなどが必要であればご確認ください。

https://github.com/koinunopochi/convert_markdown_into_html/tree/main/sample

## 要件

このツールに求める要件は以下の通りです：

1. Markdownファイルを指定されたディレクトリから読み込み、HTMLに変換する。
2. 変換後のHTMLファイルを指定されたディレクトリに出力する。
3. `.markdownignore`ファイルを使用して、特定のファイルやディレクトリを無視する。
4. フラグを使用して、出力をカスタマイズできるようにする。

## 実装

### Markdownの変換

Markdownの変換には、`markdown`パッケージを使用しました。以下のように`convert_markdown_to_html`関数を作成し、Markdownの変換を行います：

```python
def convert_markdown_to_html(md_content, icon_dir, anchor_links):
    extensions = ['markdown.extensions.fenced_code', 'codehilite', 'markdown.extensions.toc']
    extension_configs = {
        'markdown.extensions.toc': {
            'anchorlink': anchor_links,
            'permalink': anchor_links,
            'toc_depth': '2-4',
        },
    }
    md = markdown.Markdown(extensions=extensions, extension_configs=extension_configs)

    html_content = md.convert(md_content)
    toc = md.toc

    html_content = convert_info_warn_error_blocks(html_content, icon_dir)

    if anchor_links:
        html_content = f"<div class='root'><div class='content'>{html_content}</div><div class='toc'>{toc}</div></div>"
    else:
        html_content = f"<div class='root'><div class='content'>{html_content}</div></div>"

    return html_content
```

### .markdownignoreの処理

`.markdownignore`ファイルを使用して、特定のファイルやディレクトリを無視する機能を追加しました。以下のように`read_markdownignore`関数を作成し、無視するパターンを読み込みます：

```python
def read_markdownignore(doc_dir):
    markdownignore_path = os.path.join(doc_dir, ".markdownignore")
    if os.path.exists(markdownignore_path):
        with open(markdownignore_path, "r", encoding="utf-8") as file:
            return file.read().splitlines()
    return []
```

### フラグによるカスタマイズ

フラグを使用して、出力をカスタマイズできるようにしました。以下のようなフラグを追加しました：

- `--index-only`: インデックスファイルのみを生成する。
- `--no-index`: インデックスファイルを生成しない。
- `--no-style`: スタイルファイルをコピーしない。
- `--anchor-links`: ページ内リンクを生成する。

これらのフラグは、`validate_command_line_arguments`関数で処理されます：

```python
def validate_command_line_arguments():
    if "--help" in sys.argv:
        print_help()
        sys.exit(0)

    if len(sys.argv) < 3:
        print("使用法: python script.py <docフォルダのパス> <出力先> [オプション]")
        sys.exit(1)

    doc_dir = sys.argv[1]
    output_dir = sys.argv[2]
    index_only = "--index-only" in sys.argv
    no_index = "--no-index" in sys.argv
    no_style = "--no-style" in sys.argv
    anchor_links = "--anchor-links" in sys.argv

    return doc_dir, output_dir, index_only, no_index, no_style, anchor_links
```

## 今後の改善点

現在のツールにはいくつかの改善点があります：

1. エラー処理：現在、エラー処理が不十分です。突貫で作成したため、1ミリもエラー処理を行っていません、、

2. ログ出力：同じく現状はログ出力1ミリ（以下同…）
2. コードに関してもあまりよいとは言えない状態であるため、時間を見ながら改修していきたい。

これらの改善点については、今後のバージョンで対応していく予定です。

## まとめ

今回作成したMarkdown to HTML変換ツールにより、社内ブログの記事をMarkdownで書き、簡単にHTMLに変換できるようになりました。`.markdownignore`ファイルを使用して不要なファイルを無視したり、フラグを使用して出力をカスタマイズしたりできるのが特徴です。

今後は、エラー処理やログ出力などの改善を行い、より使いやすいツールにしていきます。このツールを活用することで、社内ブログの運営がより効率的になることを期待しています。