Here is a script that will take an @jupytext tree and split it out into 
child nodes, one node per cell.  To use, make a script button for it, 
select a @jupytext node, and run the script.  The script tries to create 
reasonable headlines for the nodes but of course it can't be perfect.

Please try it out so we can get a sense if it's going to be a useful 
solution. WARNING: there is NO undo capability yet so ONLY TRY IT ON A COPY 
of your file.

"""Move cells into child nodes of the root of an @jupytext node."""

CELL_MARKER = '# %%'
MARKER_LEN = len(CELL_MARKER)

def get_ipynb_header(notebook):
    start = notebook.find('# ---')
    end = notebook.find('# ---', 1) + 4
    header = notebook[start:end]
    return header

# Find root = root position for file
def optional_filter(p):
    return p.h.startswith('@jupytext')

def find_current_atfile(p):
    for p in c.p.copy().self_and_parents():
        if optional_filter(p):
            return p
    else:
        return None

def make_headline(cell: str) -> str:
    lines = cell.split('\n')
    for line in lines[1:]:
        line = line.replace('#', '').strip()
        if not line or line.startswith('%%'):
            continue
        words = line.split()
        n = min(6, len(words))
        return ' '.join(words[:n])

root = find_current_atfile(c.p)
if root is None:
    g.es(' No .ipynb tree found')
else:
    contents = root.b
    header = get_ipynb_header(contents)
    i0 = 0
    n = -1  # Number of children
    while True:
        i0 = contents.find(CELL_MARKER, i0)
        if i0 == -1:
            break
        i1 = contents.find(CELL_MARKER, i0 + 1)
        cell = contents[i0:i1] if i1 > -1 else contents[i0:]
        n += 1
        p0 = root.insertAsNthChild(n)
        p0.b = cell
        p0.h = make_headline(cell)
        if i1 == -1:
            break
        i0 = i1 - MARKER_LEN
    root.b = header + '\n@others'
    c.redraw()

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to leo-editor+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/leo-editor/ccacd0b2-f53f-4af7-b423-89b1b924455cn%40googlegroups.com.

Reply via email to