[sword-svn] r447 - trunk/versification
chrislit at crosswire.org
chrislit at crosswire.org
Wed Jul 24 21:43:16 MST 2013
Author: chrislit
Date: 2013-07-24 21:43:16 -0700 (Wed, 24 Jul 2013)
New Revision: 447
Added:
trunk/versification/v11nmax.py
Log:
added v11nmax.py utility, which takes a set of canon.h-style files and produces a canon.h-style file in which all chapter and verse counts are the maximum value witnessed by the input files
Added: trunk/versification/v11nmax.py
===================================================================
--- trunk/versification/v11nmax.py (rev 0)
+++ trunk/versification/v11nmax.py 2013-07-25 04:43:16 UTC (rev 447)
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+
+import re, sys
+from collections import Counter
+import datetime
+
+if len(sys.argv) < 3:
+ print 'Usage: ' + sys.argv[0] + ' <v11n name> <canon.h-style file(s)>'
+ print
+ print 'This utility takes a number of canon_*.h-style v11n definitions and'
+ print ' combines them into a single larger v11n system that maximizes the'
+ print ' chapters-per-book and verses-per-chapter present within its'
+ print ' constituent v11ns. Book order is determined by the order in which'
+ print ' the script encounters each Bible book.'
+ print
+ print 'For example, want to create the versification system "Max" from the'
+ print ' files contained in the directory ./canon, you might invoke:'
+ print ' ' + sys.argv[0] + ' Max ./canon/canon*.h'
+ print
+ exit()
+
+v11n = sys.argv[1]
+files = sys.argv[2:]
+
+bible = dict()
+NTbookList = list()
+OTbookList = list()
+bookName = dict()
+
+for fn in files:
+ f = open(fn).readlines()
+
+ inBooks = False
+ inVm = False
+
+ vmArray = list()
+ localOTbookList = list()
+ localNTbookList = list()
+
+ for l in f:
+ # This is not robust. It assumes that [on]tbooks[] precedes vm[] and
+ # that all of the verse counts in vm[] are part of books listed in
+ # [on]tbooks[]. In general, it assumes canon files that look like what
+ # we include in the library and generate from v11nsys.pl.
+
+ l = re.sub(r'//.*', '', l)
+ l = re.sub(r'\s*$', '', l)
+
+ if l:
+ if re.search(r'struct sbook otbooks.*?\[\]', l):
+ inBooks = 1
+ if re.search(r'struct sbook ntbooks.*?\[\]', l):
+ inBooks = 2
+ elif re.search(r'int vm.*?\[\]', l):
+ inVm = True
+ elif (inVm or inBooks) and re.search(r'};', l):
+ inBooks = False
+ inVm = False
+ elif inBooks:
+ match = re.search(r'{"(.+?)", "(.+?)", ".+?", (\d+)},', l)
+ if match:
+ id = match.group(2)
+ name = match.group(1)
+ if id not in OTbookList and id not in NTbookList:
+ if (inBooks == 1):
+ OTbookList.append(id)
+ else:
+ NTbookList.append(id)
+ bookName[id] = name
+ bible[id] = Counter()
+ if inBooks == 1:
+ localOTbookList.append((id, int(match.group(3))))
+ else:
+ localNTbookList.append((id, int(match.group(3))))
+ elif inVm:
+ vmArray.append(re.findall(r'(\d+),?', l))
+
+ vmArray = sum(vmArray, [])
+ vmArray = map(int, vmArray)
+ #print localOTbookList
+ #print localNTbookList
+ #print vmArray
+
+ for book,chapters in localOTbookList + localNTbookList:
+ #print book,chapters
+ for c in range(chapters):
+ # update the master dictionary with the max of its current value
+ # and the verse count for that chapter in the current v11n
+ bible[book][c+1] = max(bible[book][c+1], vmArray.pop(0))
+
+
+canonMax = open('canon_' + v11n.lower() + '.h', 'w')
+
+# print header stuff
+canonMax.write('/******************************************************************************\n')
+canonMax.write(' *\n')
+canonMax.write(' * canon_' + v11n.lower() + '.h - Versification data for the ' + v11n + ' system\n')
+canonMax.write(' *\n')
+canonMax.write(' * $Id$\n')
+canonMax.write(' *\n')
+canonMax.write(' * Copyright '+str(datetime.date.today().year)+' CrossWire Bible Society (http://www.crosswire.org)\n')
+canonMax.write(' * CrossWire Bible Society\n')
+canonMax.write(' * P. O. Box 2528\n')
+canonMax.write(' * Tempe, AZ 85280-2528\n')
+canonMax.write(' *\n')
+canonMax.write(' * This program is free software; you can redistribute it and/or modify it\n')
+canonMax.write(' * under the terms of the GNU General Public License as published by the\n')
+canonMax.write(' * Free Software Foundation version 2.\n')
+canonMax.write(' *\n')
+canonMax.write(' * This program is distributed in the hope that it will be useful, but\n')
+canonMax.write(' * WITHOUT ANY WARRANTY; without even the implied warranty of\n')
+canonMax.write(' * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n')
+canonMax.write(' * General Public License for more details.\n')
+canonMax.write(' */\n')
+canonMax.write('\n')
+canonMax.write('#ifndef CANON_' + v11n.upper() + '_H\n')
+canonMax.write('#define CANON_' + v11n.upper() + '_H\n')
+canonMax.write('\n')
+canonMax.write('SWORD_NAMESPACE_START\n')
+canonMax.write('\n')
+canonMax.write('\n')
+canonMax.write('// Versification system: ' + v11n + '\n')
+canonMax.write('// Book order: ' + ' '.join(OTbookList + NTbookList) + '\n')
+canonMax.write('\n')
+canonMax.write('\n')
+
+# print otbooks and ntbooks
+canonMax.write('/******************************************************************************\n')
+canonMax.write(' * [on]tbooks_' + v11n.lower() + ' - initialize static instance for all canonical\n')
+canonMax.write(' * text names and chapmax\n')
+canonMax.write(' */\n')
+
+if OTbookList:
+ canonMax.write('struct sbook otbooks_' + v11n.lower() + '[] = {\n')
+
+ for book in OTbookList:
+ canonMax.write(' {"' + bookName[book] + '", "' + book + '", "' + book + '", ' + str(len(bible[book])) + '},\n')
+
+ canonMax.write(' {"", "", "", 0}\n')
+ canonMax.write('};\n')
+ canonMax.write('\n')
+
+if NTbookList:
+ canonMax.write('struct sbook ntbooks_' + v11n.lower() + '[] = {\n')
+
+ for book in NTbookList:
+ canonMax.write(' {"' + bookName[book] + '", "' + book + '", "' + book + '", ' + str(len(bible[book])) + '},\n')
+
+ canonMax.write(' {"", "", "", 0}\n')
+ canonMax.write('};\n')
+ canonMax.write('\n')
+
+
+# print vm
+canonMax.write('/******************************************************************************\n')
+canonMax.write(' * Maximum verses per chapter\n')
+canonMax.write(' */\n')
+canonMax.write('int vm_' + v11n.lower() + '[] = {\n')
+
+for book in OTbookList + NTbookList:
+ canonMax.write(' // ' + bookName[book] + '\n')
+ verseCountList = list()
+ for ch in range(1, len(bible[book])+1):
+ verseCountList.append(bible[book][ch])
+ verseCountString = ', '.join(map(str, verseCountList))
+ verseCountString = re.sub(r'(([0-9]+, ){9}[0-9]+,) ', r'\1\n ', verseCountString)
+ canonMax.write(' ' + verseCountString + ',\n')
+
+canonMax.write('};\n')
+canonMax.write('\n')
+
+# print footer stuff
+canonMax.write('SWORD_NAMESPACE_END\n')
+canonMax.write('#endif\n')
More information about the sword-cvs
mailing list