Commit b6fd8ce6 authored by RĂ©gis Witz's avatar RĂ©gis Witz
Browse files

🔀 merge

parents 88348ba3 1c7f4354
......@@ -22,5 +22,5 @@ simple=public/BAHR20${year}_simple.html
rm -f $notices $output $simple
mkdir -p resources/hml public
wget -q -O $notices https://seafile.unistra.fr/f/${!envname}/?dl=1
python3 src/publish/convert.py $notices -t src/publish/template.html -n $volume -y $year -o $output --verbose
python3 src/publish/convert.py $notices -t src/publish/template.html -n $volume -y $year -l -o $output --verbose
create_draft $output $simple
......@@ -92,15 +92,9 @@ Chaque volume est accessible sous forme de deux pages HTML :
<p>Le thesaurus des mots-clés du BAHR est aussi disponible en <a href="Thesaurus.txt">version texte</a> ou en <a href="Thesaurus.html">version web</a>.</p>
<h3>Problèmes connus</h3>
<small>Dès qu'un problème est reglé, je le retire de cette liste. Dès que vous me signalez un problème, je le rajoute à cette liste, du moins si l'anomalie se situe au niveau du script d'impression et non pas des données présentes dans Heurist elles-mêmes.
</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 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>
<li>Dans la liste des notices, si une nouvelle lettre commence au milieu d'une page (donc que la page en question contient les dernières notices d'une initiale ET les premières notices de l'initiale suivante), l'en-tête contenait auparavant les deux initiales (genre "C-D"). Dans la version actuelle, elle contient seulement la nouvelle initiale ("D"). Ça n'est pas une anomalie.</li>
<li>Parfois, l'espacement horizontal est trop grand dans certaines lignes ; cela peut être particulièrement visible dans la chronologie. Cependant, cela est du à l'algorithme de justification du navigateur, et il n'est pas dit qu'on puisse améliorer la sitation. En attendant, un pis-aller et de changer l'ordre des mots-clés directement dans la BDD, cela peut suffir à changer la justification des lignes de cette notice particulière.</li>
<li>Parfois, l'espacement horizontal est trop grand dans certaines lignes ; cela peut être particulièrement visible dans la chronologie. Cependant, cela est du à l'algorithme de justification du navigateur, et il n'est pas dit qu'on puisse améliorer la sitation. En attendant, un pis-aller et de changer l'ordre des mots-clés directement dans la BDD, cela peut suffire à changer la justification des lignes de cette notice particulière.</li>
</ol>
<h3>Comment faire une extraction ?</h3>
......
<div><span>Collections de l’UMR 7044 ArcHiMèdE</span></div>
<div><span style='font-size: 1.5em;'>Collections de l’UMR 7044 ArcHiMèdE</span></div>
<section id="eaha">
<h2>Études d’archéologie et d’histoire ancienne (EAHA)</h2>
<h2 style='margin-top: 2em;'>Études d’archéologie et d’histoire ancienne (EAHA)</h2>
<article>
<em>Les villes antiques de la France, III, Lyonnaise 1, Autun-Chartres-Nevers</em>
......@@ -21,7 +21,7 @@
</article>
<article>
<em>Valeurs et Mémoire à Rome. Valère Maxime ou la vertu recomposée</em>
<br>sous la direction de Jean-Michel David, ouvrage au format 16 x 24 de 192 p., 1998
<br>sous la direction de Jean-Michel David, ouvrage au format 16 x 24 <br>de 192 p., 1998
<span style='float: right;'><strong>27 €*</strong></span>
</article>
<article>
......@@ -30,7 +30,7 @@
<span style='float: right;'><strong>35 €*</strong></span>
</article>
<article>
<em>L’invention des grands hommes de la Rome antique / Die Konstruktion der grossen Männer Altroms</em>
<em>L’invention des grands hommes de la Rome antique / <br>Die Konstruktion der grossen Männer Altroms</em>
<br>Actes du colloque du Collegium Beatus Rhenanus (Augst 16-18 septembre 1999), édités par Marianne Coudry et Thomas Späth, ouvrage au format 16 x 24 de 492 p., 2001
<span style='float: right;'><strong>33 €*</strong></span>
</article>
......@@ -56,7 +56,7 @@
</article>
<article>
<em>Sophrone de JĂ©rusalem, Miracles des saints Cyr et Jean (BHG I 477-479)</em>
<br>traduction commentée par Jean Gascou, ouvrage au format 16 x 24 de 242 p., 2006
<br>traduction commentée par Jean Gascou, ouvrage au format 16 x 24 <br>de 242 p., 2006
<span style='float: right;'><strong>20 €*</strong></span>
</article>
<article>
......@@ -69,6 +69,12 @@
<br>Édité par Marie-Laure Freyburger et Doris Meyer, ouvrage au format 16 x 24 <br>de 394 p., 2007
<span style='float: right;'><strong>28 €*</strong></span>
</article>
<br>
<br>
<br>
</section>
<section id="eaha-2">
<article>
<em>Athénée et les fragments d’historiens</em>
<br>Actes du colloque de Strasbourg (16-18 juin 2005) édités par Dominique Lenfant, ouvrage au format 16 x 24 de 474 p., 2007
......@@ -85,7 +91,7 @@
<span style='float: right;'><strong>32 €*</strong></span>
</article>
<article>
<em>Thèbes et ses taxes. Recherches sur la fiscalité en Égypte romaine (Ostraca de Strasbourg II)</em>
<em>Thèbes et ses taxes. Recherches sur la fiscalité en Égypte romaine <br>(Ostraca de Strasbourg II)</em>
<br>Paul Heilporn, ouvrage au format 16 x 24 de 428 p., 2009
<span style='float: right;'><strong>57 €*</strong></span>
</article>
......@@ -116,17 +122,17 @@
</article>
<article>
<em>La renaissance de l’épigramme dans la latinité tardive</em>
<br>Actes du colloque de Mulhouse (6-7 octobre 2011) édités par Marie-France Guipponi-Gineste et Céline Urlacher-Becht, ouvrage au format 16 x 24 de 571p., 2013
<br>Actes du colloque de Mulhouse (6-7 octobre 2011) <br>édités par Marie-France Guipponi-Gineste et Céline Urlacher-Becht, <br>ouvrage au format 16 x 24 de 571p., 2013
<span style='float: right;'><strong>63 €*</strong></span>
</article>
<article>
<em>Du massif de l’Ida aux pentes du mont Diktè. Peuples, territoires et communautés en Messara du XIIIe au VIIe siècle av. J.-C.</em>
<br>Daniela Lefèvre-Novaro, 2 vol., 376 p. & 406 p., 75 ill. n&b., 11 ill. coul., 133 pl. en annexe sur clé USB, 2014
<br>Daniela Lefèvre-Novaro, 2 vol., 376 p. & 406 p., 75 ill. n&b., 11 ill. coul., <br>133 pl. en annexe sur clé USB, 2014
<span style='float: right;'><strong>89 €*</strong></span>
</article>
<article>
<em>Interpretatio. Traduire l’altérité dans les civilisations de l’Antiquité</em>
<br>Édité par Frédéric Colin, Olivier Huck et Sylvie Vanséveren, ouvrage au format 16 x 24, de 448 p., 2015
<br>Édité par Frédéric Colin, Olivier Huck et Sylvie Vanséveren, <br>ouvrage au format 16 x 24, de 448 p., 2015
<span style='float: right;'><strong>59 €*</strong></span>
</article>
<article>
......@@ -144,6 +150,12 @@
<br>Édité par Sylvie Donnat, Régine Hunziker-Rodewald et Isabelle Weygand, ouvrage au format 21 x 29,7 de 364 p., 2020
<span style='float: right;'><strong>119 €*</strong></span>
</article>
<br>
<br>
<br>
</section>
<section id="eaha-3">
<article>
<em>Les aventures d’un pamphlet antidémocratique. Transmission et réception de la Constitution des Athéniens du Pseudo-Xénophon (Ve siècle av. J.-C. – XXIe siècle)</em>
<br>Édité par Dominique Lenfant, ouvrage au format 21 x 29,7 de 292 p., 2020
......@@ -156,7 +168,7 @@
</article>
<article>
<em>Caton l’Ancien et l’hellénisme. Images, traditions et réception</em>
<br>Édité par Clément Bur et Michel Humm, ouvrage au format 16 x 24 de 251 p., 2021
<br>Édité par Clément Bur et Michel Humm, <br>ouvrage au format 16 x 24 de 251 p., 2021
<span style='float: right;'><strong>59 €*</strong></span>
</article>
<article>
......
......@@ -100,6 +100,21 @@ header > h2 + p {
#toc .toc-page { text-align-last: right; }
#toc .toc-page::after { content: target-counter(attr(href url), page); }
#languages > ul {
list-style-type: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
}
#languages > ul > li {
min-width: 15em;
}
#languages > ul > li > .code {
display: inline-block;
width: 4em;
}
#ocs-chapter > p { margin: 0.5em 0 0 0; }
#revues-chapter > table,
......@@ -165,7 +180,7 @@ article { break-inside: avoid; }
font-weight: normal;
}
#eaha { text-indent: -3.75em; margin-left: 3.75em; }
#eaha > article, #coc > article, #cbr-chapter > article {
[id^="eaha"] { text-indent: -3.75em; margin-left: 3.75em; }
[id^="eaha"] > article, #coc > article, #cbr-chapter > article {
margin-bottom: 0.5em;
}
......@@ -10,6 +10,8 @@ def create_parser():
help="Output file path")
parser.add_argument('-t', '--template', default=default_template_path(),
help="Template file path")
parser.add_argument('-l', '--language_codes', action='store_true',
help="Languages vocabulary CSV file path")
parser.add_argument('-s', '--style', default=default_style_path(),
help="Stylesheet file path")
parser.add_argument('-n', '--number',
......
......@@ -52,31 +52,31 @@ def unromanize(expr):
def write_html(config, records):
IN_NOTICES_KEY = 'in_notices'
BOOK_REF_KEY = 'bahr_book_ref'
def add_book_reference(element, notice):
try:
references = getattr(element, IN_NOTICES_KEY)
except AttributeError:
references = []
references.append(getattr(notice, BOOK_REF_KEY))
setattr(element, IN_NOTICES_KEY, references)
def generate_lexicon(records, rtype, field, retrieve=None):
if not retrieve:
retrieve = lambda notice, field: notice.get(field, [])
def add_book_reference(element, reference):
try:
references = getattr(e, IN_NOTICES_KEY)
except AttributeError:
references = []
references.append(book_ref)
setattr(e, IN_NOTICES_KEY, references)
elements = records[rtype]
notices = records[heurist.Notice.RECORD_TYPE]
# we sort notices before iterating over them, ...
notices_sorted = list(notices.values())
notices_sorted.sort(key=lambda x: getattr(x, 'bahr_book_ref'))
notices_sorted.sort(key=lambda x: getattr(x, BOOK_REF_KEY))
for notice in notices_sorted:
book_ref = getattr(notice, 'bahr_book_ref')
values = retrieve(notice, field)
for hid in values:
try:
e = elements[hid]
# ... so that when we add them, they are already sorted
add_book_reference(e, book_ref)
add_book_reference(e, notice)
except KeyError:
if field != 'sources':
print("Notice %s: '%s' not found in %s" % (notice.hid, hid, field))
......@@ -174,14 +174,39 @@ def write_html(config, records):
# LOAD NOTICES
rtype = heurist.Notice.RECORD_TYPE
setattr(heurist.Notice, 'use_language_codes', config.language_codes)
notices = validate_records(records, rtype, htmlz.Notice, errors)
notices.sort(key=lambda x: x.get_authors_string(records))
# GENERATE PUBLISHING IDENTIFIERS
counter = 1
for notice in notices:
setattr(notice, 'bahr_book_ref', '%sA-%04d' % (config.year, counter))
setattr(notice, BOOK_REF_KEY, '%sA-%04d' % (config.year, counter))
counter += 1
# GENERATE LANGUAGES CODES TABLE
languages = ''
if config.language_codes:
codes = [v[0] for v in heurist.Notice.LANGUAGES.values() if v[1]]
codes.sort()
def get_label(code):
for label, values in heurist.Notice.LANGUAGES.items():
if values[0] == code:
return label
return '?'
languages += '''
<section id="languages" style="margin-top: 40pt;">
<h2 id="languages-title">Langues</h2>
<ul>
'''
for code in codes:
languages += '''
<li><span class="code">{code}</span>{label}</li>'''.format(
code=code, label=get_label(code))
languages += '''
</ul>
</section>
'''
# GENERATE LEXICONS
generate_lexicon(records, heurist.Auteur.RECORD_TYPE, 'auteurs')
generate_lexicon(records, heurist.Anthroponyme.RECORD_TYPE, 'anthroponymes')
......@@ -199,41 +224,49 @@ def write_html(config, records):
places_html = lexicon_as_html(places)
themes.sort(key=lambda x: unromanize(htmlz.strip_diacritics(x.descripteur.upper())))
themes_html = lexicon_as_html(themes)
# sources lexicon is a special case
def get_sources_of_notice(notice, field):
# field is unused here, we always use 'sources', it get us References
# yeah I know it can be misleading
refs = notice.get('sources', [])
# and NOW we get the sources, but only if Notice only points to
# the source as a whole, without any explicit Reference
sources_of_notice = []
for hid in refs:
ref = [r for r in references if r.hid == hid]
if ref: # this is a Reference pointer, not our use-case
continue
source = [s for s in sources if s.hid == hid]
if len(source) < 1: # wtf?
print("WARNING: Neither Reference not Source pointed by '%s' ???" % (hid))
continue
sources_of_notice.append(hid) # hid == source[0].hid
return sources_of_notice
notice.update_sources(records)
sources_with_or_without_refs = getattr(notice, field, {})
return [source.hid for source in sources_with_or_without_refs]
FIELD_KEY = 'bahr_refs'
update_sources_for_lexicon(records, FIELD_KEY)
generate_lexicon(records, heurist.Reference.RECORD_TYPE, 'sources')
generate_lexicon(records, heurist.Source.RECORD_TYPE, 'whatever', retrieve=get_sources_of_notice)
generate_lexicon(records, heurist.Source.RECORD_TYPE, 'references', retrieve=get_sources_of_notice)
def format_source(source, referenced_in_notices):
result = html.format_lexicon_entry(source, referenced_in_notices, True, False)
all_references = records[heurist.Reference.RECORD_TYPE]
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]
from functools import cmp_to_key
from html import compare_references
references.sort(key=cmp_to_key(compare_references))
references_vs_notices = dict()
keys_vs_references = dict()
for reference in references:
in_notices = getattr(reference, IN_NOTICES_KEY, [])
if len(in_notices) < 1:
continue
# special case: more than 1 notices point on the same reference
# of the same source BUT this reference is duplicated in the DB
def find_duplicate_if_any(ref, d):
k = ' '.join(ref.reference)
for key, r in d.items():
if key == k:
return k, r # r is a duplicate of ref
return k, ref # ref is not a duplicate, at least for now
key, ref = find_duplicate_if_any(reference, keys_vs_references)
previous = references_vs_notices.get(ref, [])
in_notices = previous + in_notices
in_notices.sort()
references_vs_notices[ref] = in_notices
keys_vs_references[key] = ref
from functools import cmp_to_key
from html import compare_references
references = list(references_vs_notices.keys())
references.sort(key=cmp_to_key(compare_references))
for reference in references:
in_notices = references_vs_notices[reference]
result += html.get_word_and_refs(reference, in_notices)
elif len(references_hid) < 1:
# if neither source nor any of its references is cited
......@@ -308,6 +341,7 @@ def write_html(config, records):
volume=volume, millesime=millesime,
contributeurs = ', '.join(contributeurs),
foreword=foreword,
langues=languages,
revues='\n'.join(periodiques),
ouvrages_collectifs='\n'.join(ouvrages_collectifs),
corpus='\n'.join(corpus),
......@@ -347,8 +381,9 @@ def parse(config):
records = unmarshall(context)
try:
write_html(config, records)
except Exception as ex:
print(ex)
except Exception:
import traceback
traceback.print_exc()
if __name__ == '__main__':
......
......@@ -65,6 +65,32 @@ class Notice(Record):
'notes': '980',
}
LANGUAGES = {
'Albanais': ['ALB', False],
'Allemand': ['GER', False],
'Anglais': ['ENG', False],
'Arabe': ['ARA', False],
'Bulgare': ['BUL', False],
'Catalan': ['CAT', False],
'Croate': ['CRO', False],
'Espagnol': ['SPA', False],
'Français': ['FRE', False],
'Grec': ['GRE', False],
'Hebreu': ['HEB', False],
'Hongrois': ['HUN', False],
'Italien': ['ITA', False],
'Latin': ['LAT', False],
'Macédonien': ['MKD', False],
'Polonais': ['POL', False],
'Portugais': ['POR', False],
'Roumain': ['RUM', False],
'Russe': ['RUS', False],
'Serbe': ['SER', False],
'Slovaque': ['SLK', False],
'Turc': ['TUR', False],
'Turque': ['TUR', False], # retro-compatibility with old exports
}
def validate(self, records, errors):
titres = self.get('titre')
if len(titres) < 1:
......@@ -87,6 +113,22 @@ class Notice(Record):
if not self.get_origin(records, hid):
errors.append("Notice '%s': revue/oc '%s' inconnu." % (self.hid, hid))
languages = self.get('langues_article', [])
for index, language in enumerate(languages):
languages[index] = self.set_language_code(language)
languages = self.get('langues_resume', [])
for index, language in enumerate(languages):
languages[index] = self.set_language_code(language)
def set_language_code(self, language):
try:
code = self.LANGUAGES[language][0]
self.LANGUAGES[language][1] = True
return code
except KeyError as ex:
print("ERROR: Missing language code '%s'" % language)
raise ex
def get_origin(self, records, hid):
try:
revues = records[Revue.RECORD_TYPE]
......
......@@ -79,7 +79,7 @@ def compare_references(x, y):
return -1
if sx > sy:
return 1
return 0
return len(x) - len(y) # '1 41' > '1'
def list2str(records, identifiers, target, prefix='', formatter=None):
......
......@@ -111,12 +111,12 @@ class Notice(heurist.Notice):
return ''
return ', %s' % ', '.join(l)
def get_sources_string(self, records, prefix=''):
def update_sources(self, records):
key = 'references'
if not hasattr(self, key):
references = self.get('sources')
if not references:
setattr(self, key, list())
setattr(self, key, dict())
return ''
all_refs = records[heurist.Reference.RECORD_TYPE]
refs = dict()
......@@ -130,16 +130,20 @@ class Notice(heurist.Notice):
except KeyError:
source_hid = hid
source = heurist.Reference.get_source(records, source_hid)
desc = source.get('descripteur')[0]
l = refs.get(desc, [])
l = refs.get(source, [])
if reference:
ref = reference.get('reference')
if ref:
l.append(' '.join(ref))
refs[desc] = l
refs[source] = l
setattr(self, key, refs)
return key
def get_sources_string(self, records, prefix=''):
key = self.update_sources(records)
result = ''
for abbrev, refs in getattr(self, key, {}).items():
for source, refs in getattr(self, key, {}).items():
abbrev = source.get('descripteur')[0]
result += ' %s %s %s' % (prefix, abbrev, ' ; '.join(refs))
return result
......
......@@ -133,6 +133,8 @@
</ul>
</section>
{langues}
<section id="revues-chapter">
......
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