import string
import DateTime

#parsing modes...
singleline_mode = 0
multiline_mode = 1
subcontent_mode = 2

#separetors
ml_sep = '-'*5
ent_sep = '-'*8
subcontents = ['comment','ping']

def parse_block(lines):
    #parsing a entry and store parts on dictionary
    d = {}
    mode = singleline_mode
    for line in lines:
        if mode == singleline_mode:
            pos = line.find(':')
            if pos != -1:
                #indicator was found.
                n = line[:pos].lower()
                v = line[pos+2:]
                d[n] = v
            elif line == ml_sep:
                #some multiline part start.
                mode = multiline_mode
                mn = ''
                continue
        elif mode == multiline_mode:
            if not mn:
                #First,
                pos = line.find(':')
                if pos != -1:
                    #set name of multiline part
                    mn = line[:pos].lower()
                else:
                    mode == singleline_mode
                if mn in subcontents:
                    mode = subcontent_mode
                    if not d.has_key(mn):
                        d[mn] = []
                        sn = mn
                    sd = {'body':''}
                    continue
                d[mn] = ''
                continue
            elif line == ml_sep:
                #start position of next multiline part
                mn = ''
            else:
                d[mn] = d[mn] + line + chr(0x0a)
        elif mode == subcontent_mode:
            pos = line.find(':')
            if pos != -1:
                #indicator was found.
                n = line[:pos].lower()
                v = line[pos+2:]
                sd[n] = v               
            elif line == ml_sep:
                #some multiline part start.
                mode = multiline_mode
                mn = ''
                d[sn].append(sd)
                continue
            else:
                sd['body'] = sd['body'] + line + chr(0x0a)
    return d

def map_category(catname,catd,cbobj):
        if not catd.has_key(catname):
                #make new category
                catid = cbobj.addCategory(catname,'')
                catd[catname] = catid
        else:
                catid = catd[catname]
        return catid,catd

#retrive mt export file
mtobj = container[mtexp]

#retrive COREBlog instance
cbobj = container[cbid]

#parse MT export  and find entry area
e = []

#ID - name dictiionary for category
catd = {}

for cat in cbobj.category_list():
        catd[cat.name] = cat.id

for line in str(mtobj).split(chr(0x0a)):
        if line == ent_sep:
                #A etnry block parsed!
                d = parse_block(e)
                #First, add category
                if d.has_key('primary category'):
                        cid1,catd = map_category(d['primary category'],catd,cbobj)
                if d.has_key('category'):
                        cid2,catd = map_category(d['primary category'],catd,cbobj)
                        subcat = [cid2]
                else:
                        subcat = []
                #Add entry
                md = 1
                if d['status'].lower() != 'publish':
                        md = 0
                for k in ['extended body','excerpt']:
                        if d.has_key(k) and d[k] == chr(0x0a):
                                d[k] =''
                eid =cbobj.manage_addEntry(d['author'],d['body'],d['extended body'],d['excerpt'],
                                                                                        main_category=cid1,moderated=md,sub_category=subcat,
                                                                                        title=d['title'], entry_date=d['date'],
                                                                                        allow_comment=int(d['allow comments']),receive_trackback=int(d['allow pings']),
                                                                                        sendnow=0,sendping = 0)
                ent = cbobj.get_entry(eid)
                #add comments
                if d.has_key('comment') and len(d['comment']) > 0:
                        for com in d['comment']:
                                ent.addComment(title="Re: " + d['title'],author=com['author'],body=com['body'],email=com['email'],
                                                                                        url=com['url'],created=com['date'])
                #add trackback
                if d.has_key('ping') and len(d['ping']) > 0:
                        for tb in d['ping']:
                                ent.addTrackback(title=tb['title'],excerpt=tb['body'],url=tb['url'],
                                                                                        blog_name=tb['blog name'],created=tb['date'])
                #Initialize entry block list
                e = []
        else:
                e.append(line)

return "Done!"
