1
# -*- coding: utf-8 -*-
3
try: locale.setlocale(locale.LC_ALL, '')
4
except locale.Error: pass
6
import sys, os, os.path
9
from random import randint
11
class HistoryEngine():
12
def __init__(self, size=10000):
17
def get_current(self):
18
if self.i>=0: return self.stack[self.i]
25
def go_back(self,n=1):
28
return self.get_current()
31
def go_forward(self,n=1):
32
if self.i<len(self.stack)-n:
34
return self.get_current()
40
return self.get_current()
45
self.i=len(self.stack)-1
46
return self.get_current()
50
self.stack=self.stack[-self.size+1:]
51
self.stack.append(uid)
52
self.i=len(self.stack)-1
55
SQL_GET_LANG_START="""SELECT rowid FROM monajat WHERE lang=? LIMIT 1"""
56
SQL_GET_LANG_END="""SELECT rowid FROM monajat WHERE lang=? ORDER BY rowid DESC LIMIT 1"""
57
SQL_GET_LANGS="""SELECT DISTINCT lang FROM monajat"""
58
SQL_GET="""SELECT rowid,* FROM monajat WHERE rowid=? LIMIT 1"""
60
class Monajat (object):
61
def __init__(self, width=-1):
62
self.__h=HistoryEngine()
63
self.__tw=textwrap.TextWrapper()
64
self.__tw.break_on_hyphens=False
66
if width!=-1: self.__tw.width=width
68
self.__prefix=self.__guess_prefix()
69
self.__db=os.path.join(self.__prefix,'data.db')
70
self.__cn=sqlite3.connect(self.__db)
71
self.__c=self.__cn.cursor()
72
self.langs=map(lambda a: a[0],self.__c.execute(SQL_GET_LANGS).fetchall())
75
i=self.__c.execute(SQL_GET_LANG_START, (l,)).fetchone()[0]
76
f=self.__c.execute(SQL_GET_LANG_END, (l,)).fetchone()[0]
77
self.lang_boundary[l]=(i,f)
78
self.__cn.row_factory=sqlite3.Row
79
self.__c=self.__cn.cursor()
80
self.fallback_lang='ar'
83
def set_lang(self,lang=None):
85
l=lang or self.__guess_lang() or self.fallback_lang
86
if l not in self.langs: l=self.fallback_lang
89
def __guess_lang(self):
90
a=locale.getlocale(locale.LC_MESSAGES)[0].split('_')
94
def __guess_prefix(self):
96
fallback_bin='/usr/bin/'
97
fallback_prefix=os.path.join(fallback_bin,'..','share',b)
98
e=os.path.dirname(sys.argv[0]) or fallback_bin
99
d=os.path.join(e,'monajat-data')
100
if os.path.isdir(d): return d
102
d=os.path.join(e,'..','share',b)
103
if os.path.isdir(d): return d
104
else: return fallback_prefix
106
def get_prefix(self):
109
def __text_warp(self,text):
112
return "\n".join(map(lambda p: p.replace('\n',' '), l))
114
return "\n".join(map(lambda p: self.__tw.fill(p), l))
116
def get(self,uid=None, lang=None):
117
if not lang: lang=self.lang
118
if lang not in self.langs: raise IndexError
120
i,f=self.lang_boundary[lang]
124
r=dict(self.__c.execute(SQL_GET, (uid,)).fetchone())
125
r['text']=self.__text_warp(r['text'])
126
if r['merits']: r['merits']=self.__text_warp(r['merits'])
129
def get_current(self):
130
u=self.__h.get_current()
131
if not u: return self.get()
132
return self.get(uid=u)
134
def go_forward(self):
135
u=self.__h.go_forward()
141
if not u: return self.get_current()
146
u=self.__h.go_first()
147
if not u: return self.get_current()
153
if not u: return self.get_current()