In [15]:
import nbformat

In [16]:
test = nbformat.read("basic_usage.ipynb",nbformat.NO_CONVERT)

In [27]:
c = test['cells'][18]

In [30]:
o = c['outputs']

In [39]:
type(o[0])


Out[39]:
nbformat.notebooknode.NotebookNode

In [33]:
err = [d for d in o if 'name' in d and d['name']=='stderr']

In [34]:
len(err)


Out[34]:
6

In [35]:
good = [d for d in o if not ('name' in d and d['name']=='stderr')]

In [40]:
type(good)


Out[40]:
list

In [41]:
c['outputs'] = good

In [45]:
c['outputs']


Out[45]:
[{'data': {'image/png': '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\n',
   'text/plain': '<Figure size 720x411.84 with 1 Axes>'},
  'metadata': {},
  'output_type': 'display_data'},
 {'data': {'application/vnd.jupyter.widget-view+json': {'model_id': '2358c46b724d4a7caa383801bc32ec1a'}},
  'metadata': {},
  'output_type': 'display_data'},
 {'data': {'application/vnd.jupyter.widget-view+json': {'model_id': '919109828f3f492187f8cae3514a91ce'}},
  'metadata': {},
  'output_type': 'display_data'},
 {'data': {'application/vnd.jupyter.widget-view+json': {'model_id': '6d4f83505c8347babedf6a0b01d84847'}},
  'metadata': {},
  'output_type': 'display_data'},
 {'data': {'application/vnd.jupyter.widget-view+json': {'model_id': '489714cd932b4756901f025a40c00dbe'}},
  'metadata': {},
  'output_type': 'display_data'},
 {'data': {'application/vnd.jupyter.widget-view+json': {'model_id': '02567adc323c4abeaf9b7df7902c8540'}},
  'metadata': {},
  'output_type': 'display_data'},
 {'data': {'application/vnd.jupyter.widget-view+json': {'model_id': 'b2553f5d19f24845a45292a2740a0fd3'}},
  'metadata': {},
  'output_type': 'display_data'}]

In [44]:
type(c['outputs'][0])


Out[44]:
nbformat.notebooknode.NotebookNode

In [ ]:


In [2]:
test = nbformat.read("/home/carl/Documents/Code/Projects/PyscesToolbox/documentation/notebooks/SymCA.ipynb",nbformat.NO_CONVERT)

Needed functionality

Removing #ex from end of coding line

Removing #ex comment

Remove comment #remove_next

Remove cells with:

"# To avoid duplication - do not run #ex"

and

"display(Image(path.join(notebook_dir,'images','sc_model_graph_1.png'))) #ex"


In [6]:
type(test.cells[0])


Out[6]:
IPython.nbformat.notebooknode.NotebookNode

In [7]:
new_base = {k:v for k,v in test.iteritems() if k != 'cells'}

In [8]:
new_base['cells'] = []

In [9]:
for cell in test.cells:
    if remove_cell_with(cell['source'],'# To avoid duplication'):
        new_lines = []
        for line in iterlines(cell['source']):
            new_line = remove_ex_comment(line)
            new_line = remove_ex(new_line)
            new_line = remove_line_with(new_line, '#remove_next')
            new_lines.append(new_line)
        new_source = combine_lines(new_lines)
        new_cell = {k:v for k,v in cell.iteritems() if k != u'source'}
        new_cell[u'source'] = new_source
        new_cell = nbformat.NotebookNode(new_cell)
        new_base['cells'].append(new_cell)

In [10]:
type(new_base['cells'][0])


Out[10]:
IPython.nbformat.notebooknode.NotebookNode

In [11]:
new = nbformat.NotebookNode(new_base)

In [12]:
nbformat.write(new,'/home/carl/Documents/Code/Projects/PyscesToolbox/documentation/notebooks/SymCA_test.ipynb')

In [3]:
def remove_ex_comment(line):
    if line.startswith('#') and '#ex' in line:
        return ''
    else:
        return line

def remove_line_with(line, pattern):
    if pattern in line:
        return ''
    else:
        return line
    
def remove_ex(line):
    return line.replace('#ex','')

def remove_cell_with(cell, pattern):
    if pattern in cell:
        return None
    else:
        return cell

In [4]:
# new_lines = []
# for line in iterlines(test.cells[0]['source']):
#     new_line = remove_ex_comment(line)
#     new_line = remove_ex(new_line)
#     new_lines.append(new_line)

In [5]:
def iterlines(text):
    lines = []
    current_line = ''
    for char in text:
        current_line = current_line + char
        if char == '\n':
            lines.append(current_line)
            current_line = ''
    lines.append(current_line)
    return lines

def combine_lines(lines):
    new = ''
    for each in lines:
        new = new + each
    return new

In [17]:
x = 'asd\nasdwqeqwe\nasdwewrwqr\nwiioasdoisad'

In [4]:
print x.split('\n')


['asd', 'asdwqeqwe', 'asdwewrwqr', 'wiioasdoisad']

In [8]:
x[-1]


Out[8]:
'\n'

In [10]:
x


Out[10]:
'asd\nasdwqeqwe\nasdwewrwqr\nwiioasdoisad\n'

In [12]:
[line + '\n' for line in x.split('\n')]


Out[12]:
['asd\n', 'asdwqeqwe\n', 'asdwewrwqr\n', 'wiioasdoisad\n', '\n']

In [19]:
def iterlines(text):
    """
    """
    lines = text.split('\n')
    if text[-1] == '\n':
        lines = [line + '\n' for line in lines[:-1]]
        return lines
    else:
        lines = [line + '\n' for line in lines[:-1]] + [lines[-1]]
        return lines

In [20]:
iterlines(x)


Out[20]:
['asd\n', 'asdwqeqwe\n', 'asdwewrwqr\n', 'wiioasdoisad']

In [21]:
from sys import path

In [23]:
from os import path

In [30]:
path.splitext('/home/carl/Documents/Code/Projects/PyscesToolbox/documentation/notebooks/SymCA_test.ipynb')


Out[30]:
('/home/carl/Documents/Code/Projects/PyscesToolbox/documentation/notebooks/SymCA_test',
 '.ipynb')

In [32]:



---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-8d1a89f30f93> in <module>()
----> 1 str.join(['1','2','3'])

TypeError: descriptor 'join' requires a 'str' object but received a 'list'

In [ ]: