nbbase.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. """The basic dict based notebook format.
  2. The Python representation of a notebook is a nested structure of
  3. dictionary subclasses that support attribute access
  4. (ipython_genutils.ipstruct.Struct). The functions in this module are merely
  5. helpers to build the structs in the right form.
  6. """
  7. # Copyright (c) IPython Development Team.
  8. # Distributed under the terms of the Modified BSD License.
  9. import pprint
  10. import uuid
  11. from ipython_genutils.ipstruct import Struct
  12. from ipython_genutils.py3compat import cast_unicode, unicode_type
  13. #-----------------------------------------------------------------------------
  14. # Code
  15. #-----------------------------------------------------------------------------
  16. # Change this when incrementing the nbformat version
  17. nbformat = 3
  18. nbformat_minor = 0
  19. nbformat_schema = 'nbformat.v3.schema.json'
  20. class NotebookNode(Struct):
  21. pass
  22. def from_dict(d):
  23. if isinstance(d, dict):
  24. newd = NotebookNode()
  25. for k,v in d.items():
  26. newd[k] = from_dict(v)
  27. return newd
  28. elif isinstance(d, (tuple, list)):
  29. return [from_dict(i) for i in d]
  30. else:
  31. return d
  32. def new_output(output_type, output_text=None, output_png=None,
  33. output_html=None, output_svg=None, output_latex=None, output_json=None,
  34. output_javascript=None, output_jpeg=None, prompt_number=None,
  35. ename=None, evalue=None, traceback=None, stream=None, metadata=None):
  36. """Create a new output, to go in the ``cell.outputs`` list of a code cell.
  37. """
  38. output = NotebookNode()
  39. output.output_type = unicode_type(output_type)
  40. if metadata is None:
  41. metadata = {}
  42. if not isinstance(metadata, dict):
  43. raise TypeError("metadata must be dict")
  44. if output_type in {u'pyout', 'display_data'}:
  45. output.metadata = metadata
  46. if output_type != 'pyerr':
  47. if output_text is not None:
  48. output.text = cast_unicode(output_text)
  49. if output_png is not None:
  50. output.png = cast_unicode(output_png)
  51. if output_jpeg is not None:
  52. output.jpeg = cast_unicode(output_jpeg)
  53. if output_html is not None:
  54. output.html = cast_unicode(output_html)
  55. if output_svg is not None:
  56. output.svg = cast_unicode(output_svg)
  57. if output_latex is not None:
  58. output.latex = cast_unicode(output_latex)
  59. if output_json is not None:
  60. output.json = cast_unicode(output_json)
  61. if output_javascript is not None:
  62. output.javascript = cast_unicode(output_javascript)
  63. if output_type == u'pyout':
  64. if prompt_number is not None:
  65. output.prompt_number = int(prompt_number)
  66. if output_type == u'pyerr':
  67. if ename is not None:
  68. output.ename = cast_unicode(ename)
  69. if evalue is not None:
  70. output.evalue = cast_unicode(evalue)
  71. if traceback is not None:
  72. output.traceback = [cast_unicode(frame) for frame in list(traceback)]
  73. if output_type == u'stream':
  74. output.stream = 'stdout' if stream is None else cast_unicode(stream)
  75. return output
  76. def new_code_cell(input=None, prompt_number=None, outputs=None,
  77. language=u'python', collapsed=False, metadata=None):
  78. """Create a new code cell with input and output"""
  79. cell = NotebookNode()
  80. cell.cell_type = u'code'
  81. if language is not None:
  82. cell.language = cast_unicode(language)
  83. if input is not None:
  84. cell.input = cast_unicode(input)
  85. if prompt_number is not None:
  86. cell.prompt_number = int(prompt_number)
  87. if outputs is None:
  88. cell.outputs = []
  89. else:
  90. cell.outputs = outputs
  91. if collapsed is not None:
  92. cell.collapsed = bool(collapsed)
  93. cell.metadata = NotebookNode(metadata or {})
  94. return cell
  95. def new_text_cell(cell_type, source=None, rendered=None, metadata=None):
  96. """Create a new text cell."""
  97. cell = NotebookNode()
  98. # VERSIONHACK: plaintext -> raw
  99. # handle never-released plaintext name for raw cells
  100. if cell_type == 'plaintext':
  101. cell_type = 'raw'
  102. if source is not None:
  103. cell.source = cast_unicode(source)
  104. cell.metadata = NotebookNode(metadata or {})
  105. cell.cell_type = cell_type
  106. return cell
  107. def new_heading_cell(source=None, level=1, rendered=None, metadata=None):
  108. """Create a new section cell with a given integer level."""
  109. cell = NotebookNode()
  110. cell.cell_type = u'heading'
  111. if source is not None:
  112. cell.source = cast_unicode(source)
  113. cell.level = int(level)
  114. cell.metadata = NotebookNode(metadata or {})
  115. return cell
  116. def new_worksheet(name=None, cells=None, metadata=None):
  117. """Create a worksheet by name with with a list of cells."""
  118. ws = NotebookNode()
  119. if cells is None:
  120. ws.cells = []
  121. else:
  122. ws.cells = list(cells)
  123. ws.metadata = NotebookNode(metadata or {})
  124. return ws
  125. def new_notebook(name=None, metadata=None, worksheets=None):
  126. """Create a notebook by name, id and a list of worksheets."""
  127. nb = NotebookNode()
  128. nb.nbformat = nbformat
  129. nb.nbformat_minor = nbformat_minor
  130. if worksheets is None:
  131. nb.worksheets = []
  132. else:
  133. nb.worksheets = list(worksheets)
  134. if metadata is None:
  135. nb.metadata = new_metadata()
  136. else:
  137. nb.metadata = NotebookNode(metadata)
  138. if name is not None:
  139. nb.metadata.name = cast_unicode(name)
  140. return nb
  141. def new_metadata(name=None, authors=None, license=None, created=None,
  142. modified=None, gistid=None):
  143. """Create a new metadata node."""
  144. metadata = NotebookNode()
  145. if name is not None:
  146. metadata.name = cast_unicode(name)
  147. if authors is not None:
  148. metadata.authors = list(authors)
  149. if created is not None:
  150. metadata.created = cast_unicode(created)
  151. if modified is not None:
  152. metadata.modified = cast_unicode(modified)
  153. if license is not None:
  154. metadata.license = cast_unicode(license)
  155. if gistid is not None:
  156. metadata.gistid = cast_unicode(gistid)
  157. return metadata
  158. def new_author(name=None, email=None, affiliation=None, url=None):
  159. """Create a new author."""
  160. author = NotebookNode()
  161. if name is not None:
  162. author.name = cast_unicode(name)
  163. if email is not None:
  164. author.email = cast_unicode(email)
  165. if affiliation is not None:
  166. author.affiliation = cast_unicode(affiliation)
  167. if url is not None:
  168. author.url = cast_unicode(url)
  169. return author