#! /usr/bin/python # -*- coding: utf-8 -*- # $Id$ """ Copyright (C) 2007, 2008 by Martin Thorsen Ranang This file is part of InTeX. InTeX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. InTeX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with InTeX. If not, see . """ __author__ = "Martin Thorsen Ranang " __revision__ = "$Rev$" __version__ = "@VERSION@" from utils import escape_aware_split from entry import Entry import string class PersonEntry(Entry): _generated_fields = [ # The values of REFERENCE are how this entry will be referred # to in the text (\co{}). 'reference', 'reference_short', # The values of TYPESET_IN_TEXT determines how the entry will # be typeset in the text. If it was referred to in its plural # form, the entry typeset will also be typeset with plural # inflection. 'typeset_in_text_first', 'typeset_in_text_last', # The values of TYPESET_IN_INDEX defines how the entry will be # typeset in the index. 'typeset_in_index', ] # Different constants used for output formatting. _label_width = len('typeset_in_text_first') _column_width = 40 _line_format = '%(_bold_on)s%%%(_label_width)ds%(_bold_off)s ' \ '%%-%(_column_width)ds' _sortkey_remove = [',', '\\', '"', "'", '{', '}', ] def __init__(self, index, parent, initials=None, name=None, index_as=None, sort_as=None, meta=None, alias=None, **rest): for attribute in self._generated_fields: setattr(self, attribute, dict.fromkeys([Entry.INFLECTION_NONE,])) Entry.__init__(self, index, parent, meta) # If this entry is an alias for another entry, indicate that # here. self.alias = alias names = escape_aware_split(name, ',') if len(names) > 1: last_name, first_name = names else: last_name, first_name = names[0], '' # Remove any preceding commas (',') and surrounding # whitespace. first_name = first_name.lstrip(',').strip() field_variable_map = [ ('reference', 'reference'), ('typeset_in_text_first', 'first_name'), ('typeset_in_text_last', 'last_name'), ('typeset_in_index', 'typeset_formal'),] # Prepare the different local variables. reference = initials if first_name: typeset_formal = '%s, %s' % (last_name, first_name) else: typeset_formal = last_name for particle in ['the', 'von', 'van', 'van der']: if first_name.endswith(particle): last_name = ' '.join([first_name[-len(particle):], last_name]) first_name = first_name[:-len(particle)] break # Will avoid the following else-clause. variables = locals() for field, variable in field_variable_map: getattr(self, field)[Entry.INFLECTION_NONE] = variables[variable] self.index_inflection = Entry.INFLECTION_NONE def get_plain_header(self): return self._line_format \ % ('', self.bold_it('value'.center(self._column_width))) def __str__(self): if self.alias: alias_line = '\n' + self._line_format % ('alias', self.alias, ) else: alias_line = '' return '\n'.join([self._line_format \ % (attribute, getattr(self, attribute)['none'], ) for attribute in self._generated_fields]) \ + alias_line def generate_index_entries(self, page, typeset_page_number=''): inflection = self.index_inflection typeset_in_index = self.typeset_in_index[inflection] # TODO: Handle this in a more proper manner. The use of # uppercase and removal of commas was done for compatibility # with the authorindex package. # The original read: sort_as = typeset_in_index # table = string.maketrans('', '') delete = ''.join(self._sortkey_remove) sort_as = typeset_in_index.upper().translate(table, delete) # For compatibility with the authorindex package: last, rest = typeset_in_index.split(None, 1) typeset_in_index = '%s %s' % (last, '~'.join(rest.split()), ) # If this is an alias entry, the index entries are affected. # Generate the index entries accordingly. if self.alias: concept, _inflection = self.index.references[self.alias] for entry in concept.generate_index_entries(page, typeset_page_number): yield entry return # Skip the regular index entries. yield '\indexentry{%(sort_as)s@%(typeset_in_index)s' \ '%(typeset_page_number)s}{%(page)s}' \ % locals() def generate_internal_macros(self, inflection): type_name = self.get_entry_type() reference = self.reference[inflection] typeset_in_text_first = self.typeset_in_text_first[inflection] typeset_in_text_last = self.typeset_in_text_last[inflection] yield '\\new%(type_name)s{%(reference)s}' \ '{%(typeset_in_text_first)s}' \ '{%(typeset_in_text_last)s}' \ % locals() if self.use_short_reference and self.reference_short[inflection]: reference = self.reference_short[inflection] yield '\\new%(type_name)s{%(reference)s}{%(typeset_in_text)s}' \ '{XC.1}' \ % locals()