2
Help us understand the problem. What are the problem?

posted at

updated at

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

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()

関連記事

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?