chiark / gitweb /
Show names of pages correctly
authorThomas Thurman <tthurman@gnome.org>
Tue, 18 Jan 2011 00:43:35 +0000 (19:43 -0500)
committerThomas Thurman <tthurman@gnome.org>
Tue, 18 Jan 2011 00:43:35 +0000 (19:43 -0500)
data/bcp.xml [moved from bcp.xml with 100% similarity]
data/ecusa-shield.png [moved from ecusa-shield.png with 100% similarity]
data/skeleton.html [moved from skeleton.html with 100% similarity]
make-pages.py [deleted file]
model.py [deleted file]
src/model.py
src/paging.py [new file with mode: 0644]

similarity index 100%
rename from bcp.xml
rename to data/bcp.xml
similarity index 100%
rename from ecusa-shield.png
rename to data/ecusa-shield.png
similarity index 100%
rename from skeleton.html
rename to data/skeleton.html
diff --git a/make-pages.py b/make-pages.py
deleted file mode 100644 (file)
index 2f5d2cc..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-import xml.sax
-import sys
-
-target = 'pages/'
-
-def copy_in_skeleton():
-    skeleton = file('skeleton.html','r').read()
-    file(target+'skeleton.html','w').write(skeleton)
-
-    shield = file('ecusa-shield.png','rb').read()
-    file(target+'logo.png','wb').write(shield)
-
-def parse_xml(filename):
-    class Handler(xml.sax.handler.ContentHandler):
-        def __init__(self):
-            self._target = None
-            self._pagenumber = None
-            self._name = None
-            self._credit = None
-            self._parentSection = None
-            self._names = {0: 'Book of Common Prayer',
-                           -1: 'Bookmarks'}
-            self._children = {}
-
-        def _storeSection(self, from_id, to_id, name):
-            self._names[to_id] = name
-            self._children[from_id] = '%s,%d' % (self._children.get(from_id,''),
-                                                 to_id)
-
-        def startElement(self, name, attributes):
-            if name=='content':
-                if not self._pagenumber:
-                    print 'content outside page'
-                    sys.exit(255)
-
-                self._target = file('%s/%04d' % (target, self._pagenumber),
-                                    'w')
-
-            elif name=='book-of-common-prayer':
-                self._name = attributes['name']
-                self._credit = attributes['credit']
-                self._title = attributes['title']
-            elif name=='page':
-                self._pagenumber = int(attributes['id'])
-            elif name=='section':
-                if attributes['level']=='1':
-                    self._parentSection = self._pagenumber
-                    self._storeSection(0,
-                                       self._parentSection,
-                                       attributes['title'])
-                elif attributes['level']=='2':
-                    if not self._parentSection:
-                        print 'Level 2 section outside a level 1 section'
-                        sys.exit(255)
-                    
-                    self._storeSection(self._parentSection,
-                                       self._pagenumber,
-                                       attributes['title'])
-            else:
-                print 'unknown tag: ',name
-                sys.exit(255)
-
-        def endElement(self, name):
-            if name=='content':
-                self._target.close()
-                self._target = None
-
-            elif name=='page':
-                self._pagenumber = None
-
-        def characters(self, content):
-            if self._target:
-                self._target.write(content)
-
-        def endDocument(self):
-            conf = file(target+'/bcp.ini', 'w')
-            conf.write('[general]\n')
-            conf.write('name=%s\n' % (self._name,))
-            conf.write('title=%s\n' % (self._title,))
-            conf.write('credit=%s\n' % (self._credit,))
-            conf.write('\n')
-
-            for k in sorted(self._names.keys()):
-                conf.write('[%s]\n' % (k,))
-                conf.write('name=%s\n' % (self._names[k],))
-                if self._children.has_key(k):
-                    conf.write('children=%s\n' % (self._children[k][1:],))
-                conf.write('\n')
-
-            conf.close()
-
-    handler = Handler()
-
-    xml.sax.parse(filename, handler)
-
-if __name__=='__main__':
-    copy_in_skeleton()
-    parse_xml('bcp.xml')
diff --git a/model.py b/model.py
deleted file mode 100644 (file)
index cfca6f2..0000000
--- a/model.py
+++ /dev/null
@@ -1,134 +0,0 @@
-import os.path
-import ConfigParser
-
-class CommonPrayerModel:
-    def __init__(self,
-                 source_dir = '/opt/commonprayer/',
-                 bookmarks = '~/.config/commonprayer.ini'):
-        self._dir = source_dir
-        self._bookmarks = bookmarks
-        self._config = ConfigParser.ConfigParser()
-        self._config.read(self._dir+'/bcp.ini')
-
-        self._skeleton = file('%s/skeleton.html' % (source_dir,), 'r').read()
-
-    def name_of(self, item, add_number = False):
-        i = str(item)
-        if self._config.has_option(i, 'name'):
-            name = self._config.get(i, 'name')
-        else:
-            # FIXME: if add_number, find the previous
-            # (have a method to map ints to the previous valid page,
-            # and the last page if there is no previous valid page)
-            name = '(problem: no name)'
-
-        if add_number:
-            name = "%d - %s" % (item, name)
-
-        return name
-
-    def _children_hash(self, s, add_numbers=False):
-        result = {}
-        for x in [int(x) for x in s.split(',')]:
-            result[x] = self.name_of(x, add_numbers)
-        return result
-
-    def __getitem__(self, item):
-        print 'Getting item: ',item
-
-        i = str(item)
-        result = {}
-
-        result['name'] = self.name_of(i)
-
-        if item==-1:
-            result['children'] = {}
-            cp = ConfigParser.ConfigParser()
-            cp.read(self._bookmarks)
-            result['children'] = self._children_hash(cp.get('bookmarks', 'pages'), True)
-        elif self._config.has_option(i, 'children'):
-            result['children'] = self._children_hash(self._config.get(i, 'children'))
-        else:
-            result['children'] = {}
-
-        filename = '%s/%04d' % (self._dir, item)
-        if os.path.exists(filename):
-            html = self._skeleton
-            html = html.replace('%(body)s',
-                                file(filename, 'r').read())
-            result['html'] = html
-
-        return result
-
-if __name__ == '__main__':
-
-    import tempfile
-    tempdir = tempfile.mkdtemp()
-    print tempdir
-
-    files = {'bcp.ini':
-                 """
-[general]
-name=test data
-
-[-1]
-name=Bookmarks
-
-[0]
-name=test data
-children=1,3
-
-[1]
-name=Lemonade
-
-[3]
-name=Edibles
-children=4,5,6
-
-[4]
-name=Apples
-
-[5]
-name=Oranges
-
-[6]
-name=Bananas
-""",
-             '0001': 'Lemonade is delicious.',
-             '0002': 'But so is water.',
-             '0003': 'This is an index page.',
-             '0004': 'Apples are fruit.',
-             '0005': 'So are oranges.',
-             '0006': 'Bananas are fruit, and good for you.',
-             '0007': 'We like bananas.',
-             'bookmarks.ini': """
-[bookmarks]
-pages=4,6
-""",
-             "skeleton.html": "[[[%(body)s]]]",
-             }
-
-    expect = [
-        (1, {'html': '[[[Lemonade is delicious.]]]', 'name': 'Lemonade', 'children': {}}),
-        (3, {'html': '[[[This is an index page.]]]', 'name': 'Edibles', 'children': {4: 'Apples', 5: 'Oranges', 6: 'Bananas'}}),
-        (-1, {'name': 'Bookmarks', 'children': {4: '4 - Apples', 6: '6 - Bananas'}}),
-        #(2, '[[[But so is water.]]]'),
-        ]
-
-    for f in files.keys():
-        file('%s/%s' % (tempdir, f), 'w').write(files[f])
-
-    cpm = CommonPrayerModel(tempdir,
-                            tempdir+'/bookmarks.ini')
-
-    import json # really simple deep comparison
-
-    for e in expect:
-        got = json.dumps(cpm[e[0]])
-        wanted = json.dumps(e[1])
-        if got==wanted:
-            print "pass"
-        else:
-            print "fail"
-            print "got   : ", got
-            print "wanted: ", wanted
index 3d836ed..ecc546b 100644 (file)
@@ -12,15 +12,25 @@ class CommonPrayerModel:
 
         self._skeleton = file('%s/skeleton.html' % (source_dir,), 'r').read()
 
+    def _named_page_before(self, page):
+       candidate = 0
+       name = '(Problem: no name)'
+       page = int(page)
+
+       for named in self._config.sections():
+               if named[0]>='0' and named[0]<='9':
+                       n = int(named)
+                       if n<page and n>candidate:
+                               candidate = n
+                               name = self._config.get(named, 'name')
+       return name
+
     def name_of(self, item, add_number = False):
         i = str(item)
         if self._config.has_option(i, 'name'):
             name = self._config.get(i, 'name')
         else:
-            # FIXME: if add_number, find the previous
-            # (have a method to map ints to the previous valid page,
-            # and the last page if there is no previous valid page)
-            name = '(problem: no name)'
+           name = self._named_page_before(item)
 
         if add_number:
             name = "%s - %s" % (item, name)
diff --git a/src/paging.py b/src/paging.py
new file mode 100644 (file)
index 0000000..01c7f52
--- /dev/null
@@ -0,0 +1,89 @@
+from glob import glob
+
+class NextPage:
+       def __init__(self, wrt):
+               self._wrt = wrt
+               self._candidate = None
+               self._lowest = None
+
+       def take(self, number):
+               if self._lowest is None or number < self._lowest:
+                       self._lowest = number
+
+               if number > self._wrt and (self._candidate is None or number < self._candidate):
+                       self._candidate = number
+
+               return False
+
+       def result(self):
+               warning = ''
+
+               if self._candidate is None:
+                       self._candidate = self._lowest
+                       warning = 'first'
+
+               return { 'page': self._candidate,
+                       'warning': warning }
+
+class PreviousPage:
+       def __init__(self, wrt):
+               self._wrt = wrt
+               self._candidate = None
+               self._highest = None
+
+       def take(self, number):
+               if self._highest is None or number > self._highest:
+                       self._highest = number
+
+               if number < self._wrt and (self._candidate is None or number > self._candidate):
+                       self._highest = number
+
+               return False
+
+       def result(self):
+               warning = ''
+
+               if self._candidate is None:
+                       self._candidate = self._highest
+                       warning = 'last'
+
+               return { 'page': self._candidate,
+                       'warning': warning }
+
+class NearestPage:
+       def __init__(self, wrt):
+               self._wrt = wrt
+               self._candidate = None
+
+       def take(self, number):
+               if self._candidate is None or abs(number-self._wrt) < abs(self._candidate-self._wrt):
+                       self._candidate = number
+
+               return False
+
+       def result(self):
+               warning = ''
+
+               if self._candidate != self._wrt:
+                       warning = 'nearest'
+
+               return { 'page': self._candidate,
+                       'warning': warning }
+
+class Paging:
+       def __init__(self, path):
+               self._path = path + '/*'
+
+       def scan(self, recipient):
+
+               for file in glob(self._path):
+                       name = file[file.rindex('/')+1:]
+                       if '.' in name:
+                               continue
+                       recipient.take(int(name))
+
+               return recipient.result()
+
+p = Paging('pages')
+print p.scan(NearestPage(0))
+