py-gfm (GithubFlavoredMarkdownExtension) が import できない時の対処法[Python3]

jupyter notebook 上で @driller 3 により公開されている [tsumiki](https://github.com/drillan/tsumiki) を試す過程で、[py-gfm](https://pythonhosted.org/py-gfm/) (GithubFlavoredMarkdownExtension) を import できない事象にあたったので対処した方法をまとめる

## 環境
* MacOS High Sierra
* Python 3.6.5

## 事象

* https://pythonhosted.org/py-gfm/ で紹介されている Quick start のコードを実行しても `module 'markdown.inlinepatterns' has no attribute 'BRK'` というメッセージが出てエラーとなる

## 結論

```bash
pip3 uninstall markdown
pip3 install git+https://github.com/Python-Markdown/markdown.git@regex-fixes
```

のようにして、git branch を指定して markdown を再インストールすると上手くいった。

## 仮説・検証

* https://pythonhosted.org/py-gfm/ で紹介されている Quick start のコードを下記のように実行しても `module 'markdown.inlinepatterns' has no attribute 'BRK'` というメッセージが出てエラーとなった

実行コード

```python:python3
    import markdown
    from mdx_gfm import GithubFlavoredMarkdownExtension

    source = """
    Hello, *world*! This is a ~~good~~marvelous day!
    Here is an auto link: https://example.org/

    Le me introduce you to [task lists] (https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments):

    - [ ] eggs
    - [x] milk

    You can also have fenced code blocks:
    ```
    import this
    ```
    """

    # Direct conversion
    html = markdown.markdown(source,
                             extensions=[GithubFlavoredMarkdownExtension()])

    # Factory-like
    md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension()])
    html = md.convert(source)
```

```:result
    ---------------------------------------------------------------------------

    ModuleNotFoundError                       Traceback (most recent call last)

    <ipython-input-1-000efe484076> in <module>()
          1 import markdown
    ----> 2 from mdx_gfm import GithubFlavoredMarkdownExtension
          3 
          4 source = """
          5 Hello, *world*! This is a ~~good~~marvelous day!


    /usr/local/lib/python3.6/site-packages/mdx_gfm/__init__.py in <module>()
         25 from markdown.extensions.nl2br import Nl2BrExtension
         26 
    ---> 27 from mdx_partial_gfm import PartialGithubFlavoredMarkdownExtension
         28 
         29 


    /usr/local/lib/python3.6/site-packages/mdx_partial_gfm/__init__.py in <module>()
         28 from markdown.extensions import Extension
         29 from markdown.extensions.fenced_code import FencedCodeExtension
    ---> 30 from markdown.extensions.smart_strong import SmartEmphasisExtension
         31 from markdown.extensions.tables import TableExtension
         32 


    ModuleNotFoundError: No module named 'markdown.extensions.smart_strong'
```

まずは、py-gfm が markdown を呼び出す事ができているのかを確認するためにインタプリタから下記を確認した。


```python:python3
import markdown

markdown.inlinepatterns
```

```:result
<module 'markdown.inlinepatterns' from '/usr/local/lib/python3.6/site-packages/markdown/inlinepatterns.py'>
```


markdown 自体は普通に import できていそう。という事で github のコードを読む

* https://github.com/Python-Markdown/markdown/blob/master/markdown/inlinepatterns.py

... どこにもエラーメッセージにある `BRK` なんてないやんけ。そりゃ動かん。
エラー発生行の次の行の `NOIMG` ってのはあったので、試しに `markdown.inlinepatterns.NOIMG` を実行してみる。


```python:python3
markdown.inlinepatterns.NOIMG
```


```:result
'(?<!\\!)'
```


うん、動きますね。

py-gfm の問題というより、`import markdown` 時点で問題がありそうだ。
試しに markdown を再インストール。

```bash:bash
$ pip3 install markdown
$ pip3 uninstall markdown
```


```python:python3
import markdown

markdown.inlinepatterns.BRK
```

```:result
    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-2-58535ab67692> in <module>()
          1 import markdown
          2 
    ----> 3 markdown.inlinepatterns.BRK
    

    AttributeError: module 'markdown.inlinepatterns' has no attribute 'BRK'
```

ダメですね orz

別途気づいた所として github の 別ブランチには `BRK` の定義あり。

https://github.com/Python-Markdown/markdown/blob/2.6/markdown/inlinepatterns.py

ブランチ指定して install すればうまく行くのではないかな。

```
pip3 uninstall markdown
pip3 install git+https://github.com/Python-Markdown/markdown.git@2.6
```


```python
import markdown

markdown.inlinepatterns.BRK
```




    '\\[([^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*)\\]'



動いた。ということは最初の Quick start を再度実行すると...

```python:python3
    import markdown
    from mdx_gfm import GithubFlavoredMarkdownExtension

    source = """
    Hello, *world*! This is a ~~good~~marvelous day!
    Here is an auto link: https://example.org/

    Le me introduce you to [task lists] (https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments):

    - [ ] eggs
    - [x] milk

    You can also have fenced code blocks:
    ```
    import this
    ```
    """

    # Direct conversion
    html = markdown.markdown(source,
                             extensions=[GithubFlavoredMarkdownExtension()])

    # Factory-like
    md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension()])
    html = md.convert(source)
```

 -> エラー発生なし。とりあえず解決。

## おまけ（tsumikiとは）

tsumikiとは先日の pycon 2018 に登壇された @driller 3 により公開されているライブラリで、jupyter notebook で Markdown と HTML を組み合わせて表示したり、段組にして表示したりする事ができます。

### 使用例


```python
%load_ext tsumiki
```


```python:jupyter-notebook_markdown_cell
%%tsumiki

:Markdown:
# Title

:HTML:::
<p>col0</p>
<font color="red">Red</font>
</br>
<font color="green">Green</font>

:Markdown:::
col1
* list1
* list2

:Markdown:::
col2
* list1
* list2
```

実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70342/5f5f062f-2a23-bbd2-a71e-a1ff6b530c03.png)


装飾や、段組にして何かの diff を見せたい時など非常に便利そうです ☺️