def update(self, sorting=None): ''' Updates the Entries stored in the database ''' if self.key.url [0] != 'file': raise IOError, "can't update the remote database `%s'" % self.key name = self.key.url[2] if Config.get('base/directsave').data: if Config.get('base/backup').data: copyfile(name, name + '.bak') namefile = open(name, 'w') iterator = Selection.Selection(sort=sorting).iterator(self.iterator()) Open.bibwrite(iterator, out=namefile, how=self.id, database=self) namefile.close () else: # create a temporary file for the new version tmp = os.path.join(os.path.dirname(name), '.#' + os.path.basename(name)) tmpfile = open(tmp, 'w') iterator = Selection.Selection(sort=sorting).iterator(self.iterator()) Open.bibwrite(iterator, out=tmpfile, how=self.id, database=self) tmpfile.close() # if we succeeded, and backup is set, backup file if Config.get('base/backup').data: os.rename(name, name + '.bak') # ...and bring new version online os.rename(tmp, name) return
def __parsefile__(self): self.dict = {} # Ouvrir le fichier associe self.parser = _bibtex.open_file(Open.url_to_local(self.key), Config.get ('bibtex/strict').data) # Incorporer les definitions de l'utilisateur if not Config.get('bibtex+/override').data: user = Config.get('bibtex/macros').data valid = re.compile('^\w+$') for k in user.keys(): if not valid.match(k): raise TypeError, _("key `%s' is malformed") % k _bibtex.set_string(self.parser, k, _bibtex.reverse(_base_fieldtype[Text], Config.get('bibtex+/braces').data, user [k][0])) finished = 0 errors = [] # Creer la base de cles iter = BibtexIterator(self, self.parser) try: entry = iter.first() if entry is not None: if entry.key is None: self.add(entry) else: if self.dict.has_key(entry.key): errors.append(_("%s:%d: key `%s' already defined") % ( str(self.key), entry.line, entry.key.key)) else: self.dict [entry.key] = entry except Exceptions.ParserError, err: errors.append (str (err))
def width (field): ''' return the graphical width of a field given its name ''' ht = Config.get ('base/fields').data field = string.lower (field) if ht.has_key (field) and hasattr (ht [field], 'width'): return ht [field].width else: return Config.get ('gnomeui/default').data [0]
def iterator (url, check): ''' This methods returns an iterator that will parse the database on the fly (useful for merging or to parse broken databases ''' if check and url.url [2] [-5:] != '.ovid': return file = open (Open.url_to_local (url)) return OvidLike.OvidLike ( file, Config.get ('ovid/mapping').data, Config.get ('ovid/deftype').data )
def bibwrite (iter, out = None, how = None, database=None): ''' writes a descriptions of a list of entries ''' if database and Config.get ('bibtex/keep-preamble').data: preamble = database.get_metadata ('bibtex-preamble', []) else: preamble = [] # default output out = out or sys.stdout if how == None: entry = iter.first () while entry: out.write (str (entry) + "\n") entry = iter.next () return writer = get_by_name (how, 'write') if writer is None: raise IOError, "type `%s' does not specify write method" % how writer (iter, out, preamble=preamble) return
def get_viewables (item, priority=[]): """Return a list of possible viewable resources for an item""" R = userexit.resource_viewer_select (Director, item) if R: return R viewables = Config.get (config_fields).data return [ (key, item[key], item [key].get_url ()) for key in priority + viewables if item.has_key (key)]
def __init__ (self, dtype, props, key=None, parent=None, help_text=''): BaseConfig.__init__ (self, dtype, props, key, parent) self.w = gtk.VBox (spacing = 6) self.sub = [] self.resize = False for sub in dtype.subtypes: w = sub.w (sub, props, parent=self) self.sub.append (w) if w.resize: self.resize = True for w in self.sub: self.w.pack_start (w.w, expand = w.resize, fill = w.resize) if key: data = Config.get (key).data i = 0 for item in data: self.sub [i].set (item) i = i + 1 self.w.show_all () return
def __init__ (self, dtype, props, key=None, parent=None, help_text=''): BaseConfig.__init__ (self, dtype, props, key, parent) if key: data = str(Config.get (key).data) else: data = '' self.m = gtk.combo_box_new_text () self.items = dtype.get () ix = 0 select = -1 for i in self.items: self.m.append_text (str (i)) if data == str(i): select = ix ix += 1 self.m.set_active (select) self.m.connect ('changed', self.update, True) self.w = gtk.HBox(spacing = 12) self.w.pack_start(self.m, True, True, padding=12) self.w.show_all () return
def setUp(self): Config.parse_directory(os.path.abspath("../ConfDir")) Config.load_user() self.db = DataBase("//localhost/Internal") self.output = cStringIO.StringIO() self.mapping = Config.get("ovid/mapping").data
def init_page_1 (self): self.fields1 = self.xml.get_widget('f_list_1') rend = gtk.CellRendererText() col = gtk.TreeViewColumn(_('Name'), rend, text = 0) self.fields1.append_column(col) rend = gtk.CellRendererText() col = gtk.TreeViewColumn(_('Type'), rend, text = 1) self.fields1.append_column(col) self.fm = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.sfm = gtk.TreeModelSort(self.fm) self.sfm.set_sort_column_id(2, gtk.SORT_ASCENDING) self.fields1.set_model(self.sfm) self.s1 = self.fields1.get_selection() self.s1.connect ('changed', self.list_1_select) self.fields = copy.copy (Config.get ('base/fields').data) for key, item in self.fields.iteritems(): self.fm.append((item.name, _typename [item.type], key, item)) self.name1 = self.xml.get_widget('name1') self.menu1 = self.xml.get_widget('type1') menu = gtk.Menu () self.menu1.set_menu (menu) self.menu_items = _typename.keys () for item in self.menu_items: Utils.popup_add (menu, _typename [item], self.select_menu, item) self.menu1.set_history (0) self.current_menu = self.menu_items [0] self.check()
def justification (field): ''' returns the representative widget of a field ''' ht = Config.get ('base/fields').data field = string.lower (field) if not ht.has_key (field): return Config.get ('gnomeui/default').data [1] if hasattr (ht [field], 'justification'): return ht [field].justification if hasattr (ht [field].type, 'justification'): return ht [field].type.justification return Config.get ('gnomeui/default').data [1]
def get_field (field): ''' return a field description given its name ''' fields = Config.get ("base/fields").data if fields.has_key (field): return fields [field] return FieldDescription (field)
def _text_get (): v = Config.get ('base/fields').data fields = [ x.name.lower() for x in v.values() if x.type is Fields.Text or x.type is Fields.LongText ] fields.sort () return fields
def __init__(self, key, fieldtype, content, parser, line): Base.Entry.__init__(self, key, fieldtype, content) self.__text = {} self.parser = parser self.line = line # Check for date fields datefields = Config.get ('bibtex/datefield').data convert = Config.get ('bibtex/months').data for field in datefields.keys(): (yearfield, monthfield) = datefields[field] # check if this entry provides a date field if not self.has_key (yearfield): continue day = None month = None try: year = int(self[yearfield].text) except ValueError: break del self[yearfield] if self.has_key(monthfield): mt = _bibtex.get_native(self.dict[monthfield]) if convert.has_key(mt): month = convert[mt] del self[monthfield] else: df = extended_date.match(mt) if df: (gd, gm) = (df.group(1), df.group(2)) if convert.has_key(gm): month = convert[gm] try: day = int(gd) except ValueError: pass del self[monthfield] self[field] = Date((year, month, day)) return
def widget (field): ''' returns the representative widget of a field ''' default = Config.get ('gnomeui/default').data [2] ht = Config.get ('base/fields').data field = string.lower (field) if not ht.has_key (field): return default if hasattr (ht [field], 'widget'): return ht [field].widget if hasattr (ht [field].type, 'widget'): return ht [field].type.widget return default
def create_native(self, value): '''Parse text in native format.''' parser = _bibtex.open_string("<set_native string>", value, Config.get ('bibtex/strict').data) iter = BibtexIterator(self, parser) entry = iter.first() if entry: # set the entry parser to the current one, so # that we keep the current string definitions entry.parser = self.parser return entry
def __init__ (self): self.pin = None self.pout = None base = Config.get ('base/lyxpipe').data pin = os.path.expanduser (base + '.in') try: ans = os.stat (pin) except OSError, msg: raise IOError (_("no input pipe `%s'") % pin)
def __setitem__(self, key, value): # First, set the cache for free self.__text[key] = (value, 0) if isinstance(value, Date): return # then, convert as bibtex. if isinstance(value, Reference): value = string.join(map(lambda item: item.key, value.list), ', ') self.dict[key] = _bibtex.reverse(_fieldtype(Types.get_field(key)), Config.get('bibtex+/braces').data, value) return
def _on_multiline_select (item, multi, user): h = Config.get ('base/fields').data for k, v in multi.items (): if not h.has_key (k): continue if v: h [k].widget = Editor.Text else: h [k].widget = Editor.Entry return True
def get_entry (entry, has_default = 1): ''' Returns an entry description given its name ''' entries = Config.get ("base/entries").data if entries.has_key (entry): return entries [entry] if has_default: return EntryDescription (entry) return None
def _check_default (item, value, user): """ If the entries are updated, update the default type with the new entry """ dfl = Config.get ('base/defaulttype').data if dfl is None: return 1 value = value [string.lower (dfl.name)] if dfl == value: Config.set ('base/defaulttype', value) return 1
def __init__ (self, dtype, props, key=None, parent=None, help_text=''): BaseConfig.__init__ (self, dtype, props, key, parent) self.w = gtk.Entry () if self.key: text = Config.get (key).data if text: self.w.set_text (text) self.w.connect ('focus-out-event', self.update) self.w.connect ('changed', self.changed) self.w.show_all () return
def __init__ (self, dtype, props, key=None, parent=None, help_text=''): BaseConfig.__init__ (self, dtype, props, key, parent) self.w = gtk.VBox (spacing = 6) h = gtk.HBox (spacing = 6) scroll = gtk.ScrolledWindow () scroll.set_policy (gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.m = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.v = gtk.TreeView(self.m) self.v.set_reorderable (True) self.v.set_headers_visible (False) rend = gtk.CellRendererText () col = gtk.TreeViewColumn ('', rend, text=0) col.set_resizable(True) #col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) col.set_min_width(200) self.v.append_column (col) self.s = self.v.get_selection() self.s.connect ('changed', self.select_cb) scroll.add (self.v) h.pack_start (scroll, True, True) bbox = gtk.VButtonBox () button = gtk.Button (_("Add")) bbox.pack_start (button) button.connect ('clicked', self.add_cb) button = gtk.Button (_("Update")) bbox.pack_start (button) button.connect ('clicked', self.update_cb) button = gtk.Button (_("Remove")) bbox.pack_start (button) button.connect ('clicked', self.remove_cb) self.m.connect ('row-changed', self._on_reordering) self.w.connect ('hide', self._on_leave) h.pack_end (bbox, False) self.w.pack_start (h, True) # Bottom self.subw = dtype.subtype.w (dtype.subtype, props, parent=self) self.w.pack_start (self.subw.w, expand = self.subw.resize, fill = self.subw.resize) if self.key: data = Config.get (self.key).data self.set (data) self.w.show_all () return
def __init__ (self, dtype, props, key=None, parent=None, help_text=''): BaseConfig.__init__ (self, dtype, props, key, parent) if self.key: value = Config.get (key).type vmin = value.min or 0 vmax = value.max or +100 else: vmin = 0 vmax = +100 adj = gtk.Adjustment (0, vmin, vmax, 1, 10, 1) self.w = gtk.SpinButton (adj, 1, 0) if self.key: value = Config.get (key).data if value is not None: self.w.set_value (value) self.w.connect ('changed', self.update, True) self.w.connect ('focus-out-event', self.update) self.w.show_all () return
def iterator (url, check): ''' This methods returns an iterator that will parse the database on the fly (useful for merging or to parse broken databases ''' if check and url.url [2] [-4:] != '.bib': return None # Ouvrir le fichier associe parser = _bibtex.open_file (Open.url_to_local (url), Config.get ('bibtex/strict').data) # create a database to generate correct keys db = Base.DataBase (url) return BibtexIterator (db, parser)
def confirm (self): ''' eventually ask for modification cancellation ''' if self.changed: if Config.get('gnome/old-confirmation-dialog').data: return Utils.Callback (_("The database has been modified.\nDiscard changes?"), self.w).answer () else: if Utils.Callback (_("The database has been modified.\nSave changes?"), self.w).answer () and self.modification_check (): self.save_document () else: return True return 1
def __init__ (self): self.documents = [] self.opened = [] histsize = Config.get ('gnome/history').data for i in range (1, histsize + 1): file = Utils.config.get_string ('/apps/pyblio/history/file%d' % i) or '' fmat = Utils.config.get_string ('/apps/pyblio/history/type%d' % i) or '' if not file: continue if not fmat: fmat = None self.opened.append ((file, fmat)) return
def _set_entries (entries): desc = Config.get ('base/fields').data ent = {} for e in entries.keys (): d = Types.EntryDescription (e) d.mandatory = \ map (lambda x, desc=desc: desc [x], entries [e] [0]) d.optional = \ map (lambda x, desc=desc: desc [x], entries [e] [1]) ent [string.lower (e)] = d Config.set ('base/entries', ent) return
def menu_select(self, menu): idx = menu.get_active_iter() entry = menu.get_model().get_value(idx, 1) # update the current entry new = self.update(self.database, copy.deepcopy(self.entry)) if new is None: entry_list = Config.get("base/entries").data.values() entry_list.sort(lambda x, y: cmp(x.name, y.name)) self.menu.set_history(entry_list.index(self.entry.type)) return else: new.type = entry self.entry = new self.update_notebook() return
def init_page_2 (self): # PAGE 2 self.entries2 = self.xml.get_widget('e_list_2') self.em = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT, gobject.TYPE_STRING ) self.entries = copy.copy (Config.get ('base/entries').data) for i in self.entries.itervalues(): self.em.append ((i.name, i, i.name.lower())) self.sem = gtk.TreeModelSort(self.em) self.sem.set_sort_column_id(2, gtk.SORT_ASCENDING) self.entries2.set_model(self.sem) rend = gtk.CellRendererText() col = gtk.TreeViewColumn(_('Entry type'), rend, text = 0) self.entries2.append_column(col) self.name2 = self.xml.get_widget('name2') self.s2 = self.entries2.get_selection() self.s2.connect('changed', self.elist_select) self.check()