class_docstr: Read notebook cells from plain Python or Julia files. Cells
  are identified by line breaks, unless they start with an
  explicit marker '# +'
class_docstr_tok: ["Read","notebook","cells","from","plain","Python","or","Julia","files",".","Cells","are","identified","by","line","breaks",",","unless","they","start","with","an","explicit","marker","'","#","+","'"]
docstr: Return position of end of cell marker, and position of first line after cell
docstr_tok: ["Return","position","of","end","of","cell","marker",",","and","position","of","first","line","after","cell"]
code: def find_cell_end(self, lines):
      """Return position of end of cell marker, and position of first line after cell"""
      if (
          self.metadata is None
          and not (
              self.cell_marker_end and self.end_code_re.match(lines[0])
          )
          and paragraph_is_fully_commented(
              lines, self.comment, self.default_language
          )
      ):
          self.cell_type = "markdown"
          for i, line in enumerate(lines):
              if _BLANK_LINE.match(line):
                  return i, i + 1, False
          return len(lines), len(lines), False
  
      if self.metadata is None:
          self.end_code_re = None
      elif not self.cell_marker_end:
          end_of_cell = self.metadata.get("endofcell", "-")
          self.end_code_re = re.compile(
              "^"
              + re.escape(self.comment)
              + " "
              + end_of_cell
              + r"\s*$"
          )
  
      return self.find_region_end(lines)
  
imports: import re
  import warnings
  from copy import copy
  from nbformat.v4.nbbase import new_code_cell, new_markdown_cell, new_raw_cell
  from packaging.version import parse
  from .doxygen import doxygen_to_markdown
  from .languages import _SCRIPT_EXTENSIONS
  from .cell_metadata import is_active, is_json_metadata, rmd_options_to_metadata, text_to_metadata
  from .languages import _JUPYTER_LANGUAGES_LOWER_AND_UPPER
  from .magics import is_magic, need_explicit_marker, uncomment_magic, unescape_code_start
  from .pep8 import pep8_lines_between_cells
  from .stringparser import StringParser
label_desc: Use image node_id 4 for calling the LightScriptCellReader obj's underlying member method code with example usage: obj.find_cell_end(lines) and returns: self, len,  len,  False, i,  unknown,  False