class BibTeXValidator: """ This checks for - duplicate entry names - duplicate fields - missing required fields * - unused fields * *) relies on the BibTeX model definition """ _log = getLogger("BibTeXValidator") def __init__(self): self._model = BibTeXModel() def validate(self, document, file, issue_handler): """ @param document: a bibtex.parser.Document object @param issue_handler: an object implementing IIssueHandler """ entry_keys = [] for entry in document.entries: # check for duplicate keys if entry.key in entry_keys: issue_handler.issue(Issue("Duplicate key <b>%s</b>" % entry.key, entry.start, entry.end, file, Issue.SEVERITY_ERROR)) else: entry_keys.append(entry.key) field_names = [] for field in entry.fields: # check for duplicate fields if field.name in field_names: issue_handler.issue(Issue("Duplicate field <b>%s</b>" % field.name, entry.start, entry.end, file, Issue.SEVERITY_ERROR)) else: field_names.append(field.name) try: # check for missing required fields required_field_names = set(map(lambda f: f.name, self._model.find_type(entry.type).required_fields)) missing_field_names = required_field_names.difference(set(field_names)) if len(missing_field_names) > 0: issue_handler.issue(Issue("Possibly missing field(s): <b>%s</b>" % ",".join(missing_field_names), entry.start, entry.end, file, Issue.SEVERITY_WARNING)) # check for unused fields optional_field_names = set(map(lambda f: f.name, self._model.find_type(entry.type).optional_fields)) unused_field_names = set(field_names).difference(optional_field_names.union(required_field_names)) if len(unused_field_names) > 0: issue_handler.issue(Issue("Possibly unused field(s): <b>%s</b>" % ",".join(unused_field_names), entry.start, entry.end, file, Issue.SEVERITY_WARNING)) except KeyError: #self._log.debug("Type not found: %s" % entry.type) pass
def _getDialog(self): if not self._dialog: self._dialog = self.find_widget("dialogInsertBibtexEntry") # get BibTeX model self._model = BibTeXModel() # setup types combobox self._activeType = None self._mapping = {} # this maps Gtk.Entry objects to field names self._fieldCache = { } # this is used to restore field values after the type has changed self._storeTypes = Gtk.ListStore(str) for t in self._model.types: self._storeTypes.append([t.name]) comboTypes = self.find_widget("comboTypes") comboTypes.set_model(self._storeTypes) cell = Gtk.CellRendererText() comboTypes.pack_start(cell, True) comboTypes.add_attribute(cell, "text", 0) self._boxRequired = self.find_widget("boxRequired") self._boxOptional = self.find_widget("boxOptional") self._entryIdent = self.find_widget("entryIdent") self._buttonOk = self.find_widget("buttonOk") self.connect_signals({ "on_comboTypes_changed": self._comboTypesChanged, "on_entryIdent_changed": self._identChanged }) comboTypes.set_active(0) return self._dialog
def __init__(self): self._model = BibTeXModel()
def __init__(self): self._model = BibTeXModel() self._parser = BibTeXParser() self._issue_handler = MockIssueHandler()