Source

pyorg / pyorg / parser.py

Full commit
Gabriele Lanaro 2b5c265 




Gabriele Lanaro e38d504 
Gabriele Lanaro 2b5c265 





Gabriele Lanaro e38d504 


Gabriele Lanaro 2b5c265 






Gabriele Lanaro e38d504 



Gabriele Lanaro 2b5c265 


Gabriele Lanaro e38d504 
Gabriele Lanaro 2b5c265 
Gabriele Lanaro e38d504 
Gabriele Lanaro 2b5c265 




Gabriele Lanaro e38d504 








"""Parser related stuff
"""
import re

def maxhead(text):
    """tell which is the topmost level, if there isn't one, return None
    """
    levels = []
    for line in text.splitlines():
        match = re.match('^(\*+)\s(.*?)\s*$', line)
        if match:
            levels.append(len(match.groups()[0]))
    
    if levels == []:
        return None
    return min(levels)

def splitheads(text):
    """Split up the topmost headers returning a list of the headers
    with the associated text.
    """
    
    top_level = maxhead(text)
    if top_level is None:
        return []

    indexes = [m.start() for m in 
               re.finditer('^(\*{%i})\s(.*?)\s*$'%maxhead(text), text, flags = re.MULTILINE)]
    ret = []
    for i in range(len(indexes)):
        start = indexes[i]
        end = indexes[i+1] if i+1 < len(indexes) else len(text)
        ret.append(text[start:end])
    
    return ret
            

class Node(object):
    """represent a typical headline+text in an orgnode file
    """
    def __init__(self, text):
        self.text = text
        self.headline = text.splitlines()[0]
        self.level = maxhead(text)

        nohead = '\n'.join(text.splitlines()[1:])
        self.childs = [Node(head) for head in splitheads(nohead)]