[PYTHON] Conversion mutuelle entre l'article Qiita et le notebook Jupyter

introduction

Quand je veux voir l'article de Qiita sur Jupyter, je peux le copier, mais j'ai créé un programme pour qu'il puisse être converti en une seule fois.

Du notebook Jupyter à Markdown

―― Commençons par convertir le notebook Jupyter en Markdown.

make_md.py


import sys, yaml
if len(sys.argv) < 2:
    exit()

try:
    with open(sys.argv[1], encoding='utf-8') as f:
        ls = yaml.load(f)['cells']
except:
    exit()

for dc in ls:
    typ = dc['cell_type']
    src = ''.join(dc['source'])
    if not src: continue
    if typ == 'markdown':
        print('%s'%src)
    elif typ == 'raw':
        print('<pre>\n%s\n</pre>'%src)
    elif typ == 'code':
        print('\n```py3:python3\n%s\n```'%src)

De Markdown à Jupyter

make_ipynb.py


import sys, urllib.request
from itertools import takewhile
if len(sys.argv) < 2:
    exit()
try:
    s = urllib.request.urlopen(sys.argv[1]+'.md').read().decode().rstrip()
    ss = s.replace('\\', '\\\\').replace('\t', '\\t').replace('"', '\\"').split('\n')
except:
    exit()
fn = ss[0]
ss[0] = '# ' + ss[0]

def parse_str(ss):
    tt = list(takewhile(lambda s: not s.startswith('```'), ss))
    ss = ss[len(tt):]
    cell_type = 'raw' if len(tt) == 0 else 'markdown'
    if cell_type == 'raw':
        nm = ss[0][(ss[0]+':').index(':')+1:]
        tg = ss[0][3:len(ss[0])-len(nm)].rstrip(':')
        ss = ss[1:]
        if tg.startswith('py') or tg == 'bash':
            cell_type = 'code'
        tt = list(takewhile(lambda s: not s.startswith('```'), ss))
        ss = ss[len(tt):]
        if cell_type == 'code':
            tt = list(takewhile(lambda s: not s.startswith('>>>'), tt))
        if ss:
            ss = ss[1:]
        tt = ([('%%' if tg == 'bash' else '# ') + tg] if tg else []) + tt
    return cell_type, tt, ss
cdin = '   "execution_count": null,\n   "outputs": [],\n   '

rr = []
while ss:
    cell_type, tt, ss = parse_str(ss)
    s = '\\n",\n    "'.join(tt)
    if s:
        rr.append("""\
   "cell_type": "%s",
   "metadata": {},
%s   "source": [
    "%s"
   ]
"""%(cell_type, '' if cell_type != 'code' else cdin, '\\n",\n    "'.join(tt)))

with open(fn+'.ipynb', 'w') as fp:
    fp.write("""\
{
 "cells": [
  {
""")
    fp.write('  },\n  {\n'.join(rr))
    fp.write("""\
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}\n""")

Postscript

c'est tout

Recommended Posts

Conversion mutuelle entre l'article Qiita et le notebook Jupyter
Conversion en virgule fixe et binaire
(En bas) Coopération entre Jupyter Notebook et l'exécution d'Excel
Conversion mutuelle entre la date et les jours écoulés depuis le 1er janvier 2000
Conversion mutuelle entre JSON et YAML / TOML en Python
Conversion entre unixtime et datetime
Jupyter Notebook: 4 trucs et astuces banals
Utiliser Jupyter Lab et Jupyter Notebook avec EC2
Opérations de base et touches de raccourci de Jupyter Notebook
Lier Python et JavaScript avec le notebook Jupyter
Conversion entre mots singuliers et pluriels
Relation entre la conversion des types de données Firestore et Go
Conversion entre le jour Julius et la date du calendrier Gregorius
[Python] Mémo de conversion entre les données temporelles et les données numériques
Mémo Jupyter Notebook
Présentation de Jupyter Notebook
Puissant ordinateur portable Jupyter
Mot de passe du notebook Jupyter
Mémo Jupyter Notebook
Lancez facilement jupyter notebook sur AWS et accédez localement
Enregistrez automatiquement les fichiers .py et .html dans le bloc-notes Jupyter.
[Windows] [Python3] Installer python3 et Jupyter Notebook (anciennement ipython notebook) sous Windows
Enregistrez et gérez les articles Qiita au format Zenn Markdown
Personnalisez Jupyter Notebook: modifiez l'arrière-plan et les icônes