docs: def text(self):
          """Linearize the bib source according to the rules of the unified style.
  
          Book:
          author. year. booktitle. (series, volume.) address: publisher.
  
          Article:
          author. year. title. journal volume(issue). pages.
  
          Incollection:
          author. year. title. In editor (ed.), booktitle, pages. address: publisher.
  
          .. seealso::
  
              http://celxj.org/downloads/UnifiedStyleSheet.pdf
              https://github.com/citation-style-language/styles/blob/master/\
              unified-style-linguistics.csl
          """
          genre = getattr(self.genre, 'value', self.genre)
          pages_at_end = genre in (
              'book',
              'phdthesis',
              'mastersthesis',
              'misc',
              'techreport')
          thesis = genre in ('phdthesis', 'mastersthesis')
  
          if self.get('editor'):
              editors = self['editor']
              affix = 'eds' if ' and ' in editors or '&' in editors else 'ed'
              editors = " %s (%s.)" % (editors, affix)
          else:
              editors = None
  
          res = [self.get('author', editors), self.get('year', 'n.d')]
          if genre == 'book':
              res.append(self.get_with_translation('booktitle') or
                         self.get_with_translation('title'))
              series = ', '.join(filter(None, [self.get('series'), self.get('volume')]))
              if series:
                  res.append('(%s.)' % series)
          elif genre == 'misc':
              # in case of misc records, we use the note field in case a title is missing.
              res.append(self.get_with_translation('title') or self.get('note'))
          else:
              res.append(self.get_with_translation('title'))
  
          if genre == 'article':
              atom = ' '.join(filter(None, [self.get('journal'), self.get('volume')]))
              if self.get('issue'):
                  atom += '(%s)' % self['issue']
              res.append(atom)
              res.append(self.get('pages'))
          elif genre == 'incollection' or genre == 'inproceedings':
              prefix = 'In'
              atom = ''
              if editors:
                  atom += editors
              if self.get('booktitle'):
                  if atom:
                      atom += ','
                  atom += " %s" % self.get_with_translation('booktitle')
              if self.get('pages'):
                  atom += ", %s" % self['pages']
              res.append(prefix + atom)
          else:
              # check for author to make sure we haven't included the editors yet.
              if editors and self.get('author'):
                  res.append("In %s" % editors)
  
              for attr in [
                  'journal',
                  'volume' if genre != 'book' else None,
              ]:
                  if attr and self.get(attr):
                      res.append(self.get(attr))
  
              if self.get('issue'):
                  res.append("(%s)" % self['issue'])
  
              if not pages_at_end and self.get('pages'):
                  res.append(self['pages'])
  
          if self.get('publisher'):
              res.append(": ".join(filter(None, [self.get('address'), self['publisher']])))
          else:
              if genre == 'misc' and self.get('howpublished'):
                  res.append(self.get('howpublished'))
  
          if not thesis and pages_at_end and self.get('pages'):
              res.append(self['pages'] + 'pp')
  
          note = self.get('note') or self._genre_note.get(genre)
          if note and note not in res:
              if thesis:
                  joiner = ','
                  if self.get('school'):
                      note += '{0} {1}'.format(joiner, self.get('school'))
                      joiner = ';'
                  if self.get('pages'):
                      note += '{0} {1}pp.'.format(joiner, self.get('pages'))
              res.append('(%s)' % note)
  
          return ' '.join(
              x if x.endswith(('.', '.)')) else '%s.' % x for x in res if x)