jupyter 转 markdown 要是能内嵌图片就好了

2020-12-30 00:33:37 +08:00
 XIVN1987

jupyter 的 Fille -> Download as 可以将 notebook 转换成 markdown,方便记笔记

可是 notebook 中的图片不会转换进 markdown 里,所以有较多图片的 notebook 转换成 markdown 就没啥意义了

我看了下 notebook 是把图片内嵌进 xxx.ipynb 文件中的,要是转换成 markdown 时也能将图片内嵌进 markdown 就好了

2237 次点击
所在节点    Jupyter
7 条回复
neosfung
2020-12-30 03:00:15 +08:00
我记得输出 html 的时候是图片转换为 base64,可以试一下看看找一下相应的代码把这步嵌入到生成 markdown 中
XIVN1987
2020-12-30 09:35:40 +08:00
@neosfung
确实,html 输出中通过<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">语法内嵌了图片

查了下这个语法叫 Data URI scheme,,希望 markdown 也能支持这种用法,,这样笔记会方便很多

感谢指点
neosfung
2020-12-30 18:54:10 +08:00
@XIVN1987 markdown 我记得支持的,这种常见的 html 标签
XIVN1987
2020-12-30 20:17:44 +08:00
@neosfung
感谢,,试了下确实支持

之前测试不工作,原来是 jupyter 导出的时候多了两个换行,,为知笔记就不认了,,把换行去掉就可以了

jupyter 导出的是

``` javascript
<img src="data:image/png;base64,iVBO...
"
>
```

改成

``` javascript
<img src="data:image/png;base64,iVBO...">
```

就可以了,,
XIVN1987
2020-12-30 21:25:46 +08:00
XIVN1987
2020-12-30 22:59:23 +08:00
写了脚本,自动将 jupyter 导出的 markdown 中的

```
![png](output_3_0.png)
```

替换成

```
<img src="data:image/png;base64,iVBO...">
```

代码如下:

``` python
#! python3
import os
import re
import binascii

srcfil = r'C:\Users\WMX\Desktop\pylab\pylab.md'

srcdir = os.path.dirname(srcfil)
dstfil = os.path.join(srcdir, os.path.basename(srcfil).replace('.md', '_emb.md'))

img_base64 = {}
for root, dirs, files in os.walk(srcdir):
for fname in files:
if fname.endswith('.png'):
img_data = open(os.path.join(root, fname), 'rb').read()
img_base64[fname] = f'<img src="data:image/png;base64,{binascii.b2a_base64(img_data, newline=False).decode("latin-1")}">'

content = open(srcfil, 'r', encoding='utf-8').read()
for img in img_base64:
content = re.sub(f'\n!\[png\]\({img}\)\n', f'\n{img_base64[img]}\n', content)

open(dstfil, 'w', encoding='utf-8').write(content)

```
neosfung
2020-12-31 17:30:02 +08:00
我写了个钩子,每次保存 ipyhb 文件的时候保存同时输出 html 和 py 文件,方便记录实验数据( html )和 git 查看改动( py )
这是我的钩子
你可以把 markdown 的保存和改写都放进来
这样每次保存 ipyhb 的时候都可以得到相对应的 markdown 文件了

```python
### If you want to auto-save .html and .py versions of your notebook:
# modified from: https://github.com/ipython/ipython/issues/8009
import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
"""post-save hook for converting notebooks to .py scripts"""
if model['type'] != 'notebook':
return # only do this for notebooks
d, fname = os.path.split(os_path)
check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)
check_call(['ipython', 'nbconvert', '--to', 'html', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740164

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX