+++ /dev/null
-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')
+++ /dev/null
-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
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)
--- /dev/null
+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))
+