LoginSignup
7
3

More than 1 year has passed since last update.

Qiitaの記事からコードブロック部分だけ抽出して表示するPythonスクリプト

Last updated at Posted at 2022-05-02

Qiitaの記事に書かれたコードを動作確認することが多いので、Qiita記事のURLを指定してコードブロック部分だけを表示するスクリプトを作りました。

使用例

すべてのコードブロックを表示
$ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055
c言語部分だけ表示
$ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 c
Python(py)部分だけ表示
$ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 py

プログラムコード

qiitacode.py
#!/usr/bin/env python3

"""
download a Qiita article and print program in code blocks

example:
    $ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055
    $ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 c
    $ python3 qiitacode.py https://qiita.com/shiracamus/items/556ff8d916712a9f7055 py
"""

import sys
import re
import requests


def load_markdown(url):
    return requests.get(f'{url}.md').text.splitlines()


def markdown_code(lines, lang=''):
    lang_pattern = rf'(\s*{lang}(:.*)?|.*:.*\.{lang})' if lang else ''
    code_start = re.compile(rf'^\s*(```|~~~){lang_pattern}\s*$')
    code_end = re.compile(r'^\s*(```|~~~)\s*$')
    in_code_block = False
    for line in lines:
        if in_code_block:
            if code_end.match(line):
                in_code_block = False
                yield '\n'
            else:
                yield line
        else:
            if code_start.match(line):
                in_code_block = True


def main():
    if not 2 <= len(sys.argv) <= 3:
        print(f'Usage: {sys.argv[0]} QIITA_ARTICLE_URL LANGUAGE')
        exit(1)
    markdown = load_markdown(url=sys.argv[1])
    lang = sys.argv[2] if len(sys.argv) > 2 else ''
    for code in markdown_code(markdown, lang):
        print(code)


if __name__ == '__main__':
    main()

関連記事

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3