summaryrefslogtreecommitdiff
path: root/biblio/bibtex/utils/pybib/Bibliography.py
diff options
context:
space:
mode:
Diffstat (limited to 'biblio/bibtex/utils/pybib/Bibliography.py')
-rw-r--r--biblio/bibtex/utils/pybib/Bibliography.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/biblio/bibtex/utils/pybib/Bibliography.py b/biblio/bibtex/utils/pybib/Bibliography.py
new file mode 100644
index 0000000000..e61b66c09e
--- /dev/null
+++ b/biblio/bibtex/utils/pybib/Bibliography.py
@@ -0,0 +1,167 @@
+# Bibliography class
+# - essentially a container for many BibEntry objects
+# - provides methods for reading/writing the bibliography
+# - provides iterators, sorting etc
+
+
+# Copyright (c) 2007, Peter Corke
+#
+# All rights reserved.
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * The name of the copyright holder may not be used to endorse or
+# promote products derived from this software without specific prior
+# written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+import string;
+import BibEntry;
+import urllib;
+import urlparse;
+import os;
+import os.path;
+import sys;
+
+NoSuchFile = "No such file";
+
+class Bibliography:
+
+ def __init__(self):
+ self.keyList = [];
+ self.abbrevDict = {}
+
+ def open(self, filename):
+ if filename == '-':
+ self.filename = "stdin";
+ return sys.stdin;
+ urlbits = urlparse.urlparse('~/lib/bib/z.bib');
+ if urlbits[0]:
+ # path is a URL
+ fp = urllib.urlopen(filename);
+ self.filename = filename;
+ else:
+ # path is a local file
+ path = os.environ['BIBPATH'];
+ for p in string.split(path, os.pathsep):
+ f = os.path.join(p, filename);
+ if os.path.isfile(f):
+ break;
+ else:
+ raise NoSuchFile;
+
+ fp = open(f, "r");
+ home = os.path.expanduser('~');
+ f2 = os.path.abspath(f);
+ common = os.path.commonprefix([home, f2]);
+ if common:
+ self.filename = "~" + f2[len(common):]
+ else:
+ self.filename = f;
+
+ return fp;
+
+ def close(self, fp):
+ fp.close();
+
+ # resolve all abbreviations found in the value fields of all entries
+ def resolveAbbrev(self):
+ #print >> sys.stderr, len(self.abbrevDict);
+ for be in self:
+ for f in be:
+ v = be.getField(f);
+ if isinstance(v,str):
+ if v in self.abbrevDict:
+ if self.abbrevDict[v]:
+ be.setField(f, self.abbrevDict[v]);
+
+ def insertEntry(self, be, ignore=False):
+ #print >> sys.stderr, "inserting key ", be.getKey()
+ # should check to see if be is of BibEntry type
+ key = be.getKey();
+ if key in [x.key for x in self.keyList]:
+ if not ignore:
+ print >> sys.stderr, "key %s already in dictionary" % (key)
+ return False;
+ self.keyList.append(be);
+ return True;
+
+ def insertAbbrev(self, abbrev, value):
+ #print >> sys.stderr, "inserting abbrev ", abbrev
+ if abbrev in self.abbrevDict:
+ #print >> sys.stderr, "abbrev %s already in list" % (abbrev)
+ return False;
+ self.abbrevDict[abbrev] = value;
+ #be.brief();
+ return True;
+
+ def __repr__(self):
+ print >> sys.stderr
+
+ def brief(self):
+ for be in self:
+ be.brief();
+
+ def getFilename(self):
+ return self.filename;
+
+ def getAbbrevs(self):
+ return self.abbrevDict;
+
+
+ def display(self):
+ for be in self:
+ be.display();
+ print >> sys.stderr
+
+ def __contains__(self, key):
+ return key in [x.key for x in self.keyList];
+
+ def __getitem__(self, i):
+ if type(i) is str:
+ index = [x.key for x in self.keyList].index(i);
+ return self.keyList[index];
+ elif type(i) is int:
+ return self.keyList[i];
+ else:
+ raise;
+
+ def __len__(self):
+ return len(self.keyList);
+
+
+ def sort(self, sortfunc):
+ # turn the dictionary of entries into a list so we can sort it
+ self.keyList.sort(sortfunc);
+
+
+ # return list of all bibentry's that match the search spec
+ def search(self, key, str, type="all", caseSens=0):
+ if str == '*':
+ return self.keyList;
+
+ result = [];
+ if string.lower(type) == "all":
+ for be in self:
+ if be.search(key, str, caseSens):
+ result.append(be);
+ else:
+ for be in self:
+ if be.isRefType(type) and be.search(key, str, caseSens):
+ result.append(be);
+ return result;