Commit ec6cc2a1 authored by Régis Witz's avatar Régis Witz
Browse files

in lexicon, sort references numerically (kinda..)

parent ffb82895
......@@ -96,7 +96,6 @@ Chaque volume est accessible sous forme de deux pages HTML :
</small>
<ol>
<li>Rajouter les abréviations pour les langues, et ne pas oublier de rajouter la section correspondante dans les chapitres introductifs.</li>
<li>Dans le lexique des sources, chaque référence doit être classé par ordre alphabétique au sein d'une même initiale.</li>
<li>Dans le lexique des sources, chaque référence doit être classé par ordre numérique romain.</li>
<li>Améliorer la liste des ouvrages collectifs pour prendre en compte les nouveaux champs dans la BDD.</li>
<li>Le lexique des auteurs doit commencer sur une page de droite, et le titre "Indices" doit se trouver sur la page de droite précédente, pas sur la même page.</li>
......
......@@ -227,7 +227,9 @@ def write_html(config, records):
references_hid = getattr(source, FIELD_KEY, [])
if len(references_hid) > 0:
references = [all_references[hid] for hid in references_hid if all_references[hid].reference]
references.sort(key=lambda x: x.reference)
from functools import cmp_to_key
from html import compare_references
references.sort(key=cmp_to_key(compare_references))
for reference in references:
in_notices = getattr(reference, IN_NOTICES_KEY, [])
if len(in_notices) < 1:
......
......@@ -278,6 +278,16 @@ class Reference(Record):
source = self.get_source(records, hid)
if not source:
errors.append("Notice '%s': Source '%s' inconnue." % (self.hid, hid))
# Replace 'reference' field, which is a list of only one element,
# which, if present, is a spaces-separated strings,
# by just a list of strings.
# We COULD convert all members of this new list to be integers,
# however these can be things like 'EA', '909C' or '279-290' too ...
# so we leave the problem to html.compare_references .
ref = self.get('reference', None)
if ref:
ref = ref[0].split(' ')
self.set('reference', ref)
@property
def source(self):
......@@ -290,11 +300,10 @@ class Reference(Record):
def reference(self):
return self.get('reference', None)
@staticmethod
def get_source(records, hid):
sources = records[Source.RECORD_TYPE]
return sources.get(hid, None)
def __repr__(self):
return self.reference[0] if self.reference else ""
return ' '.join(self.reference) if self.reference else ""
......@@ -47,6 +47,33 @@ class Reference(heurist.Reference):
return '%s %s' % (source.get('descripteur'), self.get('reference'))
def compare_references(x, y):
x = x.reference
y = y.reference
if not x:
return -1
if not y:
return 1
size = len(x) if len(x) < len(y) else len(y)
for i in range(0, size):
try:
res = int(x[i]) - int(y[i])
if res == 0:
continue
return res
except ValueError:
# things like 'EA', '909C' or '279-290'
sx = str(x[i])
sy = str(y[i])
if sx == sy:
continue
if sx < sy:
return -1
if sx > sy:
return 1
return 0
def list2str(records, identifiers, target, prefix='', formatter=None):
if not formatter:
formatter = lambda t, records: t.as_html(records)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment