# Russian translation
-# Copyright 2016, 2017 (C) PhiloSoft Design
+# Copyright 2016-2018 (C) PhiloSoft Design
# Created by Oleg Broytman <phd@phdru.name>
#
msgid ""
"Project-Id-Version: 0.0.14\n"
"Report-Msgid-Bugs-To: Oleg Broytman <phd@phdru.name>\n"
"POT-Creation-Date: 2016-03-29\n"
-"PO-Revision-Date: 2016-05-15\n"
+"PO-Revision-Date: 2018-06-11\n"
"Last-Translator: Oleg Broytman <phd@phdru.name>\n"
"Language: Russian\n"
"Language-Team: Oleg Broytman <phd@phdru.name>\n"
msgid "bytes"
msgstr "байт"
+
+msgid "surname"
+msgstr "Фамилия"
+
+msgid "name"
+msgstr "Имя"
+
+msgid "misc_name"
+msgstr "Отчество"
+
+msgid "fullname"
+msgstr "Полное имя"
+
+msgid "count"
+msgstr "Число книг"
+
+msgid "title"
+msgstr "Название"
+
+msgid "series"
+msgstr "Серия"
+
+msgid "ser_no"
+msgstr "Номер в серии"
+
+msgid "archive"
+msgstr "Архив"
+
+msgid "file"
+msgstr "Файл"
+
+msgid "size"
+msgstr "Размер"
+
+msgid "lib_id"
+msgstr "ID библиотеки"
+
+msgid "deleted"
+msgstr "Удалена"
+
+msgid "date"
+msgstr "Дата"
+
import Cheetah.ErrorCatchers as ErrorCatchers
from Cheetah.compat import unicode
import cgi
+from m_librarian.translations import translations
from views.layout import layout
##################################################
currentTime=time.time
__CHEETAH_version__ = '3.1.0'
__CHEETAH_versionTuple__ = (3, 1, 0, 'final', 1)
-__CHEETAH_genTime__ = 1528670845.131662
-__CHEETAH_genTimestamp__ = 'Mon Jun 11 01:47:25 2018'
+__CHEETAH_genTime__ = 1528717961.265576
+__CHEETAH_genTimestamp__ = 'Mon Jun 11 14:52:41 2018'
__CHEETAH_src__ = 'books_by_author.tmpl'
-__CHEETAH_srcLastModified__ = 'Mon Jun 11 01:47:23 2018'
+__CHEETAH_srcLastModified__ = 'Mon Jun 11 14:52:27 2018'
__CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
- ## CHEETAH: generated from #def body at line 5, col 1.
+ ## CHEETAH: generated from #def body at line 6, col 1.
trans = KWS.get("trans")
if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
trans = self.transaction # is None unless self.awake() was called
## START - generated method body
write(u'''<h1>''')
- _v = VFFSL(SL,"title",True) # u'$title' on line 6, col 5
- if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 6, col 5.
+ _v = VFFSL(SL,"title",True) # u'$title' on line 7, col 5
+ if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 7, col 5.
write(u''' ''')
- _v = VFFSL(SL,"author.fullname",True) # u'$author.fullname' on line 6, col 12
- if _v is not None: write(_filter(_v, rawExpr=u'$author.fullname')) # from line 6, col 12.
+ _v = VFFSL(SL,"author.fullname",True) # u'$author.fullname' on line 7, col 12
+ if _v is not None: write(_filter(_v, rawExpr=u'$author.fullname')) # from line 7, col 12.
write(u'''</h1>
''')
- if VFFSL(SL,"books",True): # generated from line 8, col 1
+ if VFFSL(SL,"books",True): # generated from line 9, col 1
write(u''' <form action="/download/" method="POST" style="height: 80%">
<table style="width: 100%; height: 90%">
+ <tr>
+ <td> </td>
+ ''')
+ if False:
+ _
+ _ = VFFSL(SL,"getattr",False)(VFFSL(SL,"translations",True), 'ugettext', None) or VFFSL(SL,"translations.gettext",True)
+ for column in VFFSL(SL,"columns",True): # generated from line 15, col 3
+ write(u''' <td style="text-align: center">''')
+ if False:
+ _(VFFSL(SL,"column",True))
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"_",False)(VFFSL(SL,"column",True))) # u'$cgi.escape($_($column))' on line 16, col 36
+ if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($_($column))')) # from line 16, col 36.
+ write(u'''</td>
+''')
+ write(u''' </tr>
''')
series = None
columns1 = VFFSL(SL,"len",False)(VFFSL(SL,"columns",True))+1
- for book in VFFSL(SL,"books",True): # generated from line 13, col 3
- if VFFSL(SL,"book.series",True) != VFFSL(SL,"series",True): # generated from line 14, col 3
+ for book in VFFSL(SL,"books",True): # generated from line 21, col 3
+ if VFFSL(SL,"book.series",True) != VFFSL(SL,"series",True): # generated from line 22, col 3
series = VFFSL(SL,"book.series",True)
write(u''' <tr>
<td colspan="''')
- _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 17, col 16
- if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 17, col 16.
+ _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 25, col 16
+ if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 25, col 16.
write(u'''"><b><i>
''')
- if VFFSL(SL,"book.series",True): # generated from line 18, col 3
- _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"series",True), 1) # u'$cgi.escape($series, 1)' on line 19, col 1
- if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($series, 1)')) # from line 19, col 1.
- else: # generated from line 20, col 3
+ if VFFSL(SL,"book.series",True): # generated from line 26, col 3
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"series",True), 1) # u'$cgi.escape($series, 1)' on line 27, col 1
+ if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($series, 1)')) # from line 27, col 1.
+ else: # generated from line 28, col 3
write(u'''\u0412\u043d\u0435 \u0441\u0435\u0440\u0438\u0439''')
write(u''' </i></b></td>
</tr>
''')
write(u''' <tr>
<td><input type=checkbox name=books value="''')
- _v = VFFSL(SL,"book.id",True) # u'$book.id' on line 27, col 46
- if _v is not None: write(_filter(_v, rawExpr=u'$book.id')) # from line 27, col 46.
+ _v = VFFSL(SL,"book.id",True) # u'$book.id' on line 35, col 46
+ if _v is not None: write(_filter(_v, rawExpr=u'$book.id')) # from line 35, col 46.
write(u'''"></td>
''')
- for column in VFFSL(SL,"columns",True): # generated from line 28, col 3
+ for column in VFFSL(SL,"columns",True): # generated from line 36, col 3
write(u''' <td>''')
- _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(unicode(VFFSL(SL,"getattr",False)(VFFSL(SL,"book",True), VFFSL(SL,"column",True)) or '')) # u"$cgi.escape(unicode($getattr($book, $column) or ''))" on line 29, col 7
- if _v is not None: write(_filter(_v, rawExpr=u"$cgi.escape(unicode($getattr($book, $column) or ''))")) # from line 29, col 7.
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(unicode(VFFSL(SL,"getattr",False)(VFFSL(SL,"book",True), VFFSL(SL,"column",True)) or '')) # u"$cgi.escape(unicode($getattr($book, $column) or ''))" on line 37, col 7
+ if _v is not None: write(_filter(_v, rawExpr=u"$cgi.escape(unicode($getattr($book, $column) or ''))")) # from line 37, col 7.
write(u'''</td>
''')
write(u''' </tr>
''')
write(u''' <tr>
<td colspan="''')
- _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 34, col 16
- if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 34, col 16.
+ _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 42, col 16
+ if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 42, col 16.
write(u'''" style="text-align: center"><input type="submit" value="\u0421\u043a\u0430\u0447\u0430\u0442\u044c"></td>
</tr>
</table>
</form>
''')
- else: # generated from line 38, col 1
+ else: # generated from line 46, col 1
write(u''' <p>\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438!</p>
''')
#encoding utf-8
#import cgi
+#from m_librarian.translations import translations
#extends views.layout
#attr $title = 'Список книг автора'
#def body
#if $books
<form action="/download/" method="POST" style="height: 80%">
<table style="width: 100%; height: 90%">
+ <tr>
+ <td> </td>
+ #set $_ = $getattr($translations, 'ugettext', None) or $translations.gettext
+ #for $column in $columns
+ <td style="text-align: center">$cgi.escape($_($column))</td>
+ #end for
+ </tr>
#set $series = None
#set $columns1 = $len($columns)+1
#for $book in $books
import Cheetah.ErrorCatchers as ErrorCatchers
from Cheetah.compat import unicode
import cgi
+from m_librarian.translations import translations
from views.layout import layout
from views.search_authors_form import search_authors_form
currentTime=time.time
__CHEETAH_version__ = '3.1.0'
__CHEETAH_versionTuple__ = (3, 1, 0, 'final', 1)
-__CHEETAH_genTime__ = 1528670903.492958
-__CHEETAH_genTimestamp__ = 'Mon Jun 11 01:48:23 2018'
+__CHEETAH_genTime__ = 1528717961.404398
+__CHEETAH_genTimestamp__ = 'Mon Jun 11 14:52:41 2018'
__CHEETAH_src__ = 'list_authors.tmpl'
-__CHEETAH_srcLastModified__ = 'Mon Jun 11 01:48:21 2018'
+__CHEETAH_srcLastModified__ = 'Mon Jun 11 14:52:34 2018'
__CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
- ## CHEETAH: generated from #def body at line 5, col 1.
+ ## CHEETAH: generated from #def body at line 6, col 1.
trans = KWS.get("trans")
if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
trans = self.transaction # is None unless self.awake() was called
write(u'''<h1>\u041f\u043e\u0438\u0441\u043a \u0430\u0432\u0442\u043e\u0440\u043e\u0432</h1>
''')
- _v = VFFSL(SL,"search_authors_form",False)(searchList=VFFSL(SL,"searchList",True)) # u'$search_authors_form(searchList=$searchList)' on line 8, col 1
- if _v is not None: write(_filter(_v, rawExpr=u'$search_authors_form(searchList=$searchList)')) # from line 8, col 1.
+ _v = VFFSL(SL,"search_authors_form",False)(searchList=VFFSL(SL,"searchList",True)) # u'$search_authors_form(searchList=$searchList)' on line 9, col 1
+ if _v is not None: write(_filter(_v, rawExpr=u'$search_authors_form(searchList=$searchList)')) # from line 9, col 1.
write(u'''
<h1>''')
- _v = VFFSL(SL,"title",True) # u'$title' on line 10, col 5
- if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 10, col 5.
+ _v = VFFSL(SL,"title",True) # u'$title' on line 11, col 5
+ if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 11, col 5.
write(u'''</h1>
''')
- if VFFSL(SL,"authors",True): # generated from line 12, col 1
+ if VFFSL(SL,"authors",True): # generated from line 13, col 1
write(u''' <table>
+ <tr>
+ ''')
+ if False:
+ _
+ _ = VFFSL(SL,"getattr",False)(VFFSL(SL,"translations",True), 'ugettext', None) or VFFSL(SL,"translations.gettext",True)
+ for column in VFFSL(SL,"columns",True): # generated from line 17, col 3
+ write(u''' <td style="text-align: center">''')
+ if False:
+ _(VFFSL(SL,"column",True))
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"_",False)(VFFSL(SL,"column",True))) # u'$cgi.escape($_($column))' on line 18, col 36
+ if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($_($column))')) # from line 18, col 36.
+ write(u'''</td>
''')
- for author in VFFSL(SL,"authors",True): # generated from line 14, col 3
+ write(u''' </tr>
+''')
+ for author in VFFSL(SL,"authors",True): # generated from line 21, col 3
write(u''' <tr>
''')
- for column in VFFSL(SL,"columns",True): # generated from line 16, col 3
+ for column in VFFSL(SL,"columns",True): # generated from line 23, col 3
write(u''' <td><a href="/books-by-author/''')
- _v = VFFSL(SL,"author.id",True) # u'$author.id' on line 17, col 35
- if _v is not None: write(_filter(_v, rawExpr=u'$author.id')) # from line 17, col 35.
+ _v = VFFSL(SL,"author.id",True) # u'$author.id' on line 24, col 35
+ if _v is not None: write(_filter(_v, rawExpr=u'$author.id')) # from line 24, col 35.
write(u'''/">
''')
- _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(unicode(VFFSL(SL,"getattr",False)(VFFSL(SL,"author",True), VFFSL(SL,"column",True)) or '')) # u"$cgi.escape(unicode($getattr($author, $column) or ''))" on line 18, col 5
- if _v is not None: write(_filter(_v, rawExpr=u"$cgi.escape(unicode($getattr($author, $column) or ''))")) # from line 18, col 5.
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(unicode(VFFSL(SL,"getattr",False)(VFFSL(SL,"author",True), VFFSL(SL,"column",True)) or '')) # u"$cgi.escape(unicode($getattr($author, $column) or ''))" on line 25, col 5
+ if _v is not None: write(_filter(_v, rawExpr=u"$cgi.escape(unicode($getattr($author, $column) or ''))")) # from line 25, col 5.
write(u'''
</a></td>
''')
''')
write(u''' </table>
''')
- else: # generated from line 24, col 1
+ else: # generated from line 31, col 1
write(u''' <p>\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0430!</p>
''')
#encoding utf-8
#import cgi
+#from m_librarian.translations import translations
#extends views.layout
#attr $title = 'Список авторов'
#def body
#if $authors
<table>
+ <tr>
+ #set $_ = $getattr($translations, 'ugettext', None) or $translations.gettext
+ #for $column in $columns
+ <td style="text-align: center">$cgi.escape($_($column))</td>
+ #end for
+ </tr>
#for $author in $authors
<tr>
#for $column in $columns
import Cheetah.ErrorCatchers as ErrorCatchers
from Cheetah.compat import unicode
import cgi
+from m_librarian.translations import translations
from views.layout import layout
##################################################
currentTime=time.time
__CHEETAH_version__ = '3.1.0'
__CHEETAH_versionTuple__ = (3, 1, 0, 'final', 1)
-__CHEETAH_genTime__ = 1528670845.332275
-__CHEETAH_genTimestamp__ = 'Mon Jun 11 01:47:25 2018'
+__CHEETAH_genTime__ = 1528717961.535029
+__CHEETAH_genTimestamp__ = 'Mon Jun 11 14:52:41 2018'
__CHEETAH_src__ = 'list_books.tmpl'
-__CHEETAH_srcLastModified__ = 'Mon Jun 11 01:46:57 2018'
+__CHEETAH_srcLastModified__ = 'Mon Jun 11 14:52:39 2018'
__CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
- ## CHEETAH: generated from #def body at line 5, col 1.
+ ## CHEETAH: generated from #def body at line 6, col 1.
trans = KWS.get("trans")
if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
trans = self.transaction # is None unless self.awake() was called
## START - generated method body
write(u'''<h1>''')
- _v = VFFSL(SL,"title",True) # u'$title' on line 6, col 5
- if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 6, col 5.
+ _v = VFFSL(SL,"title",True) # u'$title' on line 7, col 5
+ if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 7, col 5.
write(u'''</h1>
''')
- if VFFSL(SL,"books_by_author",True): # generated from line 8, col 1
+ if VFFSL(SL,"books_by_author",True): # generated from line 9, col 1
write(u''' <form action="/download/" method="POST" style="height: 80%">
<table style="width: 100%; height: 90%">
+ <tr>
+ <td> </td>
+ ''')
+ if False:
+ _
+ _ = VFFSL(SL,"getattr",False)(VFFSL(SL,"translations",True), 'ugettext', None) or VFFSL(SL,"translations.gettext",True)
+ for column in VFFSL(SL,"columns",True): # generated from line 15, col 3
+ write(u''' <td style="text-align: center">''')
+ if False:
+ _(VFFSL(SL,"column",True))
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"_",False)(VFFSL(SL,"column",True))) # u'$cgi.escape($_($column))' on line 16, col 36
+ if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($_($column))')) # from line 16, col 36.
+ write(u'''</td>
+''')
+ write(u''' </tr>
''')
series = None
columns1 = VFFSL(SL,"len",False)(VFFSL(SL,"columns",True))+1
- for author in VFFSL(SL,"sorted",False)(VFFSL(SL,"books_by_author",True)): # generated from line 13, col 3
+ for author in VFFSL(SL,"sorted",False)(VFFSL(SL,"books_by_author",True)): # generated from line 21, col 3
books = VFFSL(SL,"books_by_author",True)[VFFSL(SL,"author",True)]
- for book in VFFSL(SL,"books",True): # generated from line 15, col 5
- if VFFSL(SL,"book.series",True) != VFFSL(SL,"series",True): # generated from line 16, col 5
+ for book in VFFSL(SL,"books",True): # generated from line 23, col 5
+ if VFFSL(SL,"book.series",True) != VFFSL(SL,"series",True): # generated from line 24, col 5
series = VFFSL(SL,"book.series",True)
write(u''' <tr>
<td colspan="''')
- _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 19, col 16
- if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 19, col 16.
+ _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 27, col 16
+ if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 27, col 16.
write(u'''"><b>
''')
- _v = VFFSL(SL,"author",True) # u'$author' on line 20, col 3
- if _v is not None: write(_filter(_v, rawExpr=u'$author')) # from line 20, col 3.
+ _v = VFFSL(SL,"author",True) # u'$author' on line 28, col 3
+ if _v is not None: write(_filter(_v, rawExpr=u'$author')) # from line 28, col 3.
write(u''' \u2014 <i>
''')
- if VFFSL(SL,"book.series",True): # generated from line 21, col 3
- _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"series",True), 1) # u'$cgi.escape($series, 1)' on line 22, col 1
- if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($series, 1)')) # from line 22, col 1.
- else: # generated from line 23, col 3
+ if VFFSL(SL,"book.series",True): # generated from line 29, col 3
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(VFFSL(SL,"series",True), 1) # u'$cgi.escape($series, 1)' on line 30, col 1
+ if _v is not None: write(_filter(_v, rawExpr=u'$cgi.escape($series, 1)')) # from line 30, col 1.
+ else: # generated from line 31, col 3
write(u'''\u0412\u043d\u0435 \u0441\u0435\u0440\u0438\u0439''')
write(u''' </i></b></td>
</tr>
''')
write(u''' <tr>
<td><input type=checkbox name=books value="''')
- _v = VFFSL(SL,"book.id",True) # u'$book.id' on line 30, col 46
- if _v is not None: write(_filter(_v, rawExpr=u'$book.id')) # from line 30, col 46.
+ _v = VFFSL(SL,"book.id",True) # u'$book.id' on line 38, col 46
+ if _v is not None: write(_filter(_v, rawExpr=u'$book.id')) # from line 38, col 46.
write(u'''"></td>
''')
- for column in VFFSL(SL,"columns",True): # generated from line 31, col 3
+ for column in VFFSL(SL,"columns",True): # generated from line 39, col 3
write(u''' <td>''')
- _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(unicode(VFFSL(SL,"getattr",False)(VFFSL(SL,"book",True), VFFSL(SL,"column",True)) or '')) # u"$cgi.escape(unicode($getattr($book, $column) or ''))" on line 32, col 7
- if _v is not None: write(_filter(_v, rawExpr=u"$cgi.escape(unicode($getattr($book, $column) or ''))")) # from line 32, col 7.
+ _v = VFN(VFFSL(SL,"cgi",True),"escape",False)(unicode(VFFSL(SL,"getattr",False)(VFFSL(SL,"book",True), VFFSL(SL,"column",True)) or '')) # u"$cgi.escape(unicode($getattr($book, $column) or ''))" on line 40, col 7
+ if _v is not None: write(_filter(_v, rawExpr=u"$cgi.escape(unicode($getattr($book, $column) or ''))")) # from line 40, col 7.
write(u'''</td>
''')
write(u''' </tr>
''')
write(u''' <tr>
<td colspan="''')
- _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 38, col 16
- if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 38, col 16.
+ _v = VFFSL(SL,"columns1",True) # u'$columns1' on line 46, col 16
+ if _v is not None: write(_filter(_v, rawExpr=u'$columns1')) # from line 46, col 16.
write(u'''" style="text-align: center"><input type="submit" value="\u0421\u043a\u0430\u0447\u0430\u0442\u044c"></td>
</tr>
</table>
</form>
''')
- else: # generated from line 42, col 1
+ else: # generated from line 50, col 1
write(u''' <p>\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438!</p>
''')
#encoding utf-8
#import cgi
+#from m_librarian.translations import translations
#extends views.layout
#attr $title = 'Список книг'
#def body
#if $books_by_author
<form action="/download/" method="POST" style="height: 80%">
<table style="width: 100%; height: 90%">
+ <tr>
+ <td> </td>
+ #set $_ = $getattr($translations, 'ugettext', None) or $translations.gettext
+ #for $column in $columns
+ <td style="text-align: center">$cgi.escape($_($column))</td>
+ #end for
+ </tr>
#set $series = None
#set $columns1 = $len($columns)+1
#for $author in $sorted($books_by_author)