#   Programmer: Daniel Pozmanter
#   E-mail:     drpython@bluebottle.com
#   Note:       You must reply to the verification e-mail to get through.
#
#   Copyright 2003-2010 Daniel Pozmanter
#
#   Distributed under the terms of the GPL (GNU Public License)
#
#    DrPython is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#Preferences

#LongLineCol from Chris McDonough
#Changed "doc.longlinecol" to "doc.long.line.col"

import drPreferences
import re

def  GetPrefValue(preflabel, text):
    restart = re.compile('^<' + preflabel + '>', re.M)
    reend = re.compile('</' + preflabel + '>$', re.M)
    start = restart.search(text)
    end = reend.search(text)

    if start is None or end is None:
        return None

    return text[start.end():end.start()]

def ConvertRawPreference(preference, type, default):
    if type == 0:
        if preference:
            return preference
        else:
            return default
    elif type == 1:
        try:
            return int(preference)
        except:
            return 0
    elif type == 2:
        return preference

def ExtractPreferenceFromText(text, pref):
    try:
        start = text.index("<" + pref + ">") + len(pref) + 2
        end = text.index("</" + pref + ">")

        return text[start:end]
    except:
        return ""

def ReadPreferences(prefs, prefsfile):
    #Handle exceptions in parent function.
    #sets prefs for parent frame.
    #Use GetPrefFromText(oldpref, text, prefstring) for string prefs
    #Use GetPrefFromText(oldpref, text, prefstring, True) for int prefs
    #Use ExtractPreferenceFromText(text, prefstring) for prefs where and empty
    #string is a valid value.

    fin = open(prefsfile, 'r')
    text = fin.read()
    fin.close()

    PreferencesDictionary = drPreferences.GetPreferencesDictionary()

    for Entry in PreferencesDictionary:
        for Preference in PreferencesDictionary[Entry]:
            value = GetPrefValue(Preference[1], text)
            if value is not None:
                prefs[Preference[0]] = ConvertRawPreference(value, Preference[2], prefs[Preference[0]])

def WritePreferences(prefs, prefsfile):
    fin = open(prefsfile, 'w')

    PreferencesDictionary = drPreferences.GetPreferencesDictionary()

    for Entry in PreferencesDictionary:
        for Preference in PreferencesDictionary[Entry]:
            if Preference[2] == 1:
                fin.write('<' + Preference[1] + '>' + str(prefs[Preference[0]]) + '</' + Preference[1] + '>\n')
            else:
                fin.write('<' + Preference[1] + '>' + prefs[Preference[0]] + '</' + Preference[1] + '>\n')
    fin.close()


#*****************************
#Old Functions (Still Used In Plugins)

def GetPreference(pref, prefsfile):
    #Handle exceptions in parent function.
    fin = open(prefsfile, 'r')
    text = fin.read()
    fin.close()

    #Test File:
    if text.find("drpython") < 0:
        return -1

    return ExtractPreferenceFromText(text, pref)

def GetPrefFromText(oldvalue, text, targetpref, integer = False):
    if integer:
        pref = ExtractPreferenceFromText(text, targetpref)
        if pref:
            return SafeInt(pref)
    else:
        pref = ExtractPreferenceFromText(text, targetpref)
        if pref:
            return pref
    return oldvalue

def SafeInt(string):
    if string:
        try:
            return int(string)
        except:
            return 0
    return 0