import re

def blocks_from_text(text):
    lines=text.splitlines(); blocks=[]; i=0
    while i<len(lines):
        line=lines[i].strip()
        if not line:
            i+=1; continue
        if line.startswith('|'):
            rows=[]
            while i<len(lines) and lines[i].strip().startswith('|'):
                cells=[c.strip() for c in lines[i].strip().strip('|').split('|')]
                if not all(re.match(r'^:?-+:?$',c.replace(' ','')) for c in cells): rows.append(cells)
                i+=1
            blocks.append(('table',rows)); continue
        m=re.match(r'^(#{1,4}) (.+)$',line)
        if m:
            blocks.append(('heading',len(m.group(1)),m.group(2))); i+=1; continue
        if re.match(r'^[-*] ',line):
            blocks.append(('bullet',line[2:])); i+=1; continue
        if re.match(r'^\d+\. ',line):
            blocks.append(('number',re.sub(r'^\d+\. ','',line))); i+=1; continue
        para=[line]; i+=1
        while i<len(lines) and lines[i].strip() and not re.match(r'^(#{1,4}) |^\||^[-*] |^\d+\. ',lines[i]):
            para.append(lines[i].strip()); i+=1
        blocks.append(('paragraph',' '.join(para)))
    return blocks
