pyorg / pyorg / parser.py

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 58b63a9 







Gabriele Lanaro 2b5c265 
Gabriele Lanaro 6c6caf1 






Gabriele Lanaro e38d504 





Gabriele Lanaro 6c6caf1 
Gabriele Lanaro e38d504 
Gabriele Lanaro 58b63a9 
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
            
def parse_tags(head):
    """parse the tag entries on org headlines, return a list of them
    """
    match = re.search(r':([\w:]*):\s*$', head)
    if match:
        return match.group(1).split(':')
    else:
        return []

def parse_properties(props):
    """parse the contents of the properties section into a dictionary
    """
    regex = re.compile("^\s*:(\w+):\s*(.*?)\s*$",re.MULTILINE)
    return dict(regex.findall(props))


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)
        self.tags = parse_tags(self.headline)

        nohead = '\n'.join(text.splitlines()[1:])
        self.childs = [Node(head) for head in splitheads(nohead)]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.