~ubuntu-branches/ubuntu/lucid/monajat/lucid

« back to all changes in this revision

Viewing changes to monajat/monajat.py

  • Committer: Bazaar Package Importer
  • Author(s): أحمد المحمودي (Ahmed El-Mahmoudy)
  • Date: 2009-12-21 10:36:41 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20091221103641-i7o1qicc69y4py8q
Tags: 2.3.1-0ubuntu1
* New upstream release. (LP: #506085)
* Code is re-written in python, hence packaging changed accordingly.
* Added manpages for monajat-applet & monajat-mod
* Added patch desktop.diff to:
  + Remove Encoding field.
  + Add X-Islamic-Software category.
  + Replace irrevelant categories with Utility.
* debian/copyright: Updated & converted to machine-readable format.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
import locale
 
3
try: locale.setlocale(locale.LC_ALL, '')
 
4
except locale.Error: pass
 
5
import textwrap
 
6
import sys, os, os.path
 
7
import sqlite3
 
8
 
 
9
from random import randint
 
10
 
 
11
class HistoryEngine():
 
12
  def __init__(self, size=10000):
 
13
    self.size=size
 
14
    self.stack=[]
 
15
    self.i=-1
 
16
 
 
17
  def get_current(self):
 
18
    if self.i>=0: return self.stack[self.i]
 
19
    else: return None
 
20
 
 
21
  def clear(self):
 
22
    self.i=-1
 
23
    self.stack=[]
 
24
 
 
25
  def go_back(self,n=1):
 
26
    if self.i>n-1:
 
27
      self.i-=n
 
28
      return self.get_current()
 
29
    return None
 
30
 
 
31
  def go_forward(self,n=1):
 
32
    if self.i<len(self.stack)-n:
 
33
      self.i+=n
 
34
      return self.get_current()
 
35
    return None
 
36
 
 
37
  def go_first(self):
 
38
    if len(self.stack)>0:
 
39
      self.i=0
 
40
      return self.get_current()
 
41
    return None
 
42
 
 
43
  def go_last(self):
 
44
    if len(self.stack)>0:
 
45
      self.i=len(self.stack)-1
 
46
      return self.get_current()
 
47
    return None
 
48
 
 
49
  def push(self,uid):
 
50
    self.stack=self.stack[-self.size+1:]
 
51
    self.stack.append(uid)
 
52
    self.i=len(self.stack)-1
 
53
 
 
54
 
 
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"""
 
59
 
 
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
 
65
    self.__width=width
 
66
    if width!=-1:  self.__tw.width=width
 
67
 
 
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())
 
73
    self.lang_boundary={}
 
74
    for l in self.langs:
 
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'
 
81
    self.set_lang()
 
82
 
 
83
  def set_lang(self,lang=None):
 
84
    self.__h.go_last()
 
85
    l=lang or self.__guess_lang() or self.fallback_lang
 
86
    if l not in self.langs: l=self.fallback_lang
 
87
    self.lang=l
 
88
 
 
89
  def __guess_lang(self):
 
90
    a=locale.getlocale(locale.LC_MESSAGES)[0].split('_')
 
91
    if not a: return None
 
92
    return a[0]
 
93
 
 
94
  def __guess_prefix(self):
 
95
    b='monajat'
 
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
 
101
    else:
 
102
      d=os.path.join(e,'..','share',b)
 
103
      if os.path.isdir(d): return d
 
104
      else: return fallback_prefix
 
105
 
 
106
  def get_prefix(self):
 
107
    return self.__prefix
 
108
 
 
109
  def __text_warp(self,text):
 
110
    l=text.split('\n\n')
 
111
    if self.__width==-1:
 
112
      return "\n".join(map(lambda p: p.replace('\n',' '), l))
 
113
    else:
 
114
      return "\n".join(map(lambda p: self.__tw.fill(p), l))
 
115
 
 
116
  def get(self,uid=None, lang=None):
 
117
    if not lang: lang=self.lang
 
118
    if lang not in self.langs: raise IndexError
 
119
    
 
120
    i,f=self.lang_boundary[lang]
 
121
    if not uid:
 
122
      uid=randint(i,f)
 
123
      self.__h.push(uid)
 
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'])
 
127
    return r
 
128
 
 
129
  def get_current(self):
 
130
    u=self.__h.get_current()
 
131
    if not u: return self.get()
 
132
    return self.get(uid=u)
 
133
 
 
134
  def go_forward(self):
 
135
    u=self.__h.go_forward()
 
136
    r=self.get(uid=u)
 
137
    return r
 
138
 
 
139
  def go_back(self):
 
140
    u=self.__h.go_back()
 
141
    if not u: return self.get_current()
 
142
    r=self.get(uid=u)
 
143
    return r
 
144
 
 
145
  def go_first(self):
 
146
    u=self.__h.go_first()
 
147
    if not u: return self.get_current()
 
148
    r=self.get(uid=u)
 
149
    return r
 
150
 
 
151
  def go_last(self):
 
152
    u=self.__h.go_last()
 
153
    if not u: return self.get_current()
 
154
    r=self.get(uid=u)
 
155
    return r
 
156
 
 
157
  def clear(self):
 
158
    self.__h.clear()